python面向对象实现K均值聚类

来源:互联网 发布:网络语byd是什么意思 编辑:程序博客网 时间:2024/06/08 10:16

此例中先以随机点为核心进行第一次聚类,再将结果的质心作为核心再次聚类,重复两次,改善了聚类效果

import pandas as pdfrom pandas import DataFrame,Seriesimport numpy as npimport matplotlib.pyplot as pltfrom numpy import random as npr#数据准备a1=npr.randn(100,2)*(25,30)+(100,200);b1=npr.randn(100,2)*(30,40)+(300,400)c1=npr.randn(100,2)*(45,60)+(300,200);d1=npr.randn(100,2)*(55,35)+(100,500)data=[]data.extend([x for xl in(a1,b1,c1,d1) for x in xl])data=DataFrame(data)类=[]#定义类别类(分类),操作点方法(放置)class 分类:    成员=[];质心=[0,0]    def __init__(self,点):        self.成员=[点]        self.质心=list(DataFrame(self.成员).mean(axis=0))    def 添加成员(self,点):        self.成员.extend([点])        self.质心=list(DataFrame(self.成员).mean(axis=0))def  放置(点):    m=[]    for x in 类:         m.append([x,((点[0] - x.质心[0])**2 + (点[1] - x.质心[1])**2)**0.5])    距离集合=DataFrame(m,columns=['a','b'])    最近类=距离集合.ix[距离集合['b'].idxmin()][0]    最近类.添加成员(点)#随机确定第一次核心随机点=list(list(data.ix[i]) for i in npr.randint(0,data.shape[0]-1,size=4))print(随机点)#操作点方法def func():    类.append(a);类.append(b);类.append(c);类.append(d)    for i in range(data.shape[0]):        放置(list(data.ix[i]))# ----------------------------------------------------------------------------------------# 原始数据fig, axes = plt.subplots(1,4,figsize=(20,8))axes[0].scatter(data[0], data[1])# 一次迭代类=[]a, b, c, d = [分类(随机点[i]) for i in range(4)]#第一次放置点,确定新核心func()#作图ad=DataFrame(a.成员);bd=DataFrame(b.成员);cd=DataFrame(c.成员);dd=DataFrame(d.成员)for v,xd in enumerate([ad,bd,cd,dd]):    axes[1].scatter(xd[0],xd[1],color=['g','k','y','r'][v])axes[1].scatter(DataFrame(随机点)[0],DataFrame(随机点)[1],s=80)# 二次迭代#确定新核心随机点=list([a.质心,b.质心,c.质心,d.质心])类=[]a, b, c, d = [分类(随机点[i]) for i in range(4)]#第二次放置点func()#作图ad=DataFrame(a.成员);bd=DataFrame(b.成员);cd=DataFrame(c.成员);dd=DataFrame(d.成员)for v,xd in enumerate([ad,bd,cd,dd]):    axes[2].scatter(xd[0],xd[1],color=['g','k','y','r'][v])axes[2].scatter(DataFrame(随机点)[0],DataFrame(随机点)[1],s=80)# 三次迭代#确定新核心随机点=list([a.质心,b.质心,c.质心,d.质心])类=[]a, b, c, d = [分类(随机点[i]) for i in range(4)]#第三次放置点func()#作图ad=DataFrame(a.成员);bd=DataFrame(b.成员);cd=DataFrame(c.成员);dd=DataFrame(d.成员)for v,xd in enumerate([ad,bd,cd,dd]):    axes[3].scatter(xd[0],xd[1],color=['g','k','y','r'][v])axes[3].scatter(DataFrame(随机点)[0],DataFrame(随机点)[1],s=80)print(ad.shape,bd.shape,cd.shape,dd.shape)plt.show()

0 0
原创粉丝点击