Kmeans
* kmeans算法过程描述如下所示:
1.创建k个点作为起始质心点,c1,c2,…,ck
2.重复以下过程直到收敛
遍历所有样本xi,根据距离确定每一个样本的类别。
确定类别后,计算每一个样本到各自质心的距离,然后求和。和用来和前一次计算出来的距离和比较,已确定是否收敛。
对每一个类,计算所有样本的均值并将其作为新的质心(对于点而言,就是所有x坐标的平均值作为质心的x坐标,所有
y坐标的平均值作为y坐标的均值)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets
datasets.make_blobs?
x,y=datasets.make_blobs(n_features=3,centers=3)
def init(x,centers=3,):
'''
根据x每一个特征的数值范围,产生centers个数据点:
'''
array=[]
for i in x.T:
maxx,minx=np.max(x),np.min(x)
array.append(np.random.random(centers)*(maxx-minx)+minx)
return np.array(array).T
def distance(x,k):
'''
几何距离,返回每一点的标签
'''
return np.argmin(np.array([np.sqrt(np.sum((x-i)**2,axis=1))for i in k]).T,axis=1)
k=init(x,centers=3)
plt.plot(x[:,0],x[:,1],'*')
plt.plot(k[:,0],k[:,1],'b*')
plt.show()
for i in range(10):
'''
计算新的k,循环
'''
k=np.array([np.mean(x[kinds==i],axis=0) for i in set(kinds)])
kinds=distance(x,k)
#print(k.shape,len(set(kinds)))
plt.plot(x[:,0],x[:,1],'*')
plt.plot(k[:,0],k[:,1],'r*')
plt.show()