算法思想:
以空间中K个点为中心,对最靠近他们的点进行归类,通过迭代,逐次更新各聚类中心点的值,直到有最好的聚类效果
算法描述:
1)开始随机选中k个点作为初始中心
2)开始迭代,求其到各中心ci的距离,算出距离di,选出di最小的一个中心点,作为这个点所在类
3)利用均值的方法更新该类的中心值,也就是把迭代过后,所有属于某个中心点的值的x和y进行求平均找到新的中心点
4)对于所有的c个聚类中心,如果利用(2)(3)的方法迭代更新后,值保持不变,则迭代结束(或者达到一定的次数),否则继续迭代
算法流程:
输入k,data[n]
1)选择k个初始中心点c[0] = data[0],.....,c[k-1]=data[k-1]
2)对于data[0], ...... data[n-1] 分别与c[0] ....c[k-1]比较,选出差值最小的,标记为i
3)对于所有标记点相同的,重新计算c[i]的值
4)重复(2)(3)操作,直到所有c[i]值的变化小于给定阈值
代码实现
import numpy as np
def Kmeans(X, k, maxIt):
# numPoints 是 X 的行数量,numDim是X的列数量
numPoints = X.shape[0]
numDim = X.shape[1]
# 因为X只有 x,y两个特征,需要最后聚类后的分类结果,所以需要让矩阵多一个列
dataSet = np.zeros((numPoints, numDim + 1))
# 把X的内容赋值给dataSet的第一列和第二列,所以第三列的分类结果初始值为0
# 逗号前是行,逗号后是列
dataSet[:, :-1] = X
#centroids = dataSet[np.random.randint(numPoints, size=k), :]