第10.4节 从零实现Kmeans聚类算法
各位朋友大家好,欢迎来到月来客栈,我是掌柜空字符。
本期推送内容目录如下,如果本期内容对你有所帮助,欢迎点赞、转发支持掌柜!
10.4 从零实现-means聚类算法 10.4.1 随机初始化簇中心 10.4.2 簇分配矩阵实现 10.4.3 簇中心矩阵实现 10.4.4 聚类算法实现 10.4.5 小结
10.4 从零实现-means聚类算法
通过第10.3节内容的介绍,我们已经知道了-means聚类算法中两个关键未知变量的计算公式,接下来需要完成的就是对其进行编码实现。在第10.2.1节中笔者介绍过,聚类算法的步骤主要分为以下4个步骤:
(1) 随机选择k个样本点作为k个簇的初始簇中心。
(2) 计算每个样本点与初始簇中心的相似度大小,并将该样本点划分到与之相似度最大的簇中心所对应的簇中。
(3) 根据每个簇中现有的样本点,重新计算每个簇的簇中心。
(4) 循环迭代步骤(2)和步骤(3),直到目标函数收敛,即簇中心不再发生变化。
其中步骤(4)为循环迭代过程,因此整个聚类过程的关键在于前3步。接下来就开始分别对其实现。完整代码可以参见Book/Chapter10/02_kmeans.py
文件。
10.4.1 随机初始化簇中心
-means聚类算法的簇中心由同时随机初始化k个簇中心得到,因此这里可以借助Python中的random.sample()
方法实现,代码如下:
import random
def InitCentroids(X, K):
n = X.shape[0]
rands_index = np.array(random.sample(range(1, n), K))
centriod = X[rands_index, :]
return centriod
在上述代码中,第3行用来得到数据集X
中一共有多少个样本点,第4行用来在数值[1,n]中随机取k个不重复的值,第5行则是以第4行得到的k个值为下标,在数据集中取对应的k个样本点,即簇中心。
10.4.2 簇分配矩阵实现
对于簇分配矩阵的实现,根据式(106)可知,只需先遍历每个样本点,然后计算其到每个簇中心的聚类,选择较近的,实现代码如下:
def findClostestCentroids(X, centroid):
n = X.shape[0]
idx = np.zeros(n, dtype=int)
for i in range(n):
subs = centroid - X[i, :]
dimension2 = np.power(subs, 2)
dimension_s = np.sum(dimension2, axis=1)
idx[i] = np.where(dimension_s == dimension_s.min())[0][0]
return idx
在上述代码中,第3行用来初始化1个全0的n
维向量,第4~8行用来分别遍历每个样本点,然后计算其到所有簇中心的距离,最后选择与之距离最近的簇中心。同时,需要注意的是,在实际的编码过程中其实并不需要通过一个形状为的分配矩阵来存储每个样本的分配信息。只需将每个簇进行类别编号,然后对每个样本点赋予一个对应的编号,因此,在上述代码中返回的idx
就是每个样本点距离其最近簇的簇编号。例如idx=[0,1,2]
表示这3个样本点分别属于第0个簇、第1个簇和第2个簇。
为你认可的知识付费,欢迎订阅本专栏阅读更多优质内容!