@@ -20,7 +20,7 @@ K-Means 是发现给定数据集的 K 个簇的聚类算法, 之所以称之为
2020
2121### K-Means 术语
2222
23- * 簇: 簇中的对象是相似的.
23+ * 簇: 所有数据点点集合, 簇中的对象是相似的。
2424* 质心: 簇中所有点的中心(计算所有点的均值而来).
2525* SSE: Sum of Sqared Error(平方误差和), SSE 值越小,表示越接近它们的质心. 由于对误差取了平方,因此更加注重那么远离中心的点.
2626
@@ -29,7 +29,7 @@ K-Means 是发现给定数据集的 K 个簇的聚类算法, 之所以称之为
2929![ K-Means 术语图] ( ../images/10.KMeans/apachecn-k-means-term-1.jpg )
3030
3131### K-Means 工作流程
32- 1 . 首先, 随机确定 K 个初始点作为质心.
32+ 1 . 首先, 随机确定 K 个初始点作为质心(不是数据中的点) .
33332 . 然后将数据集中的每个点分配到一个簇中, 具体来讲, 就是为每个点找到距其最近的质心, 并将其分配该质心所对应的簇. 这一步完成之后, 每个簇的质心更新为该簇说有点的平均值.
3434
3535上述过程的 ` 伪代码 ` 如下:
@@ -96,7 +96,7 @@ def randCent(dataSet, k):
9696``` python
9797# k-means 聚类算法
9898# 该算法会创建k个质心,然后将每个点分配到最近的质心,再重新计算质心。
99- # 这个过程重复数次,知道数据点的簇分配结果不再改变位置 。
99+ # 这个过程重复数次,直到数据点的簇分配结果不再改变位置 。
100100# 运行结果(多次运行结果可能会不一样,可以试试,原因为随机质心的影响,但总的结果是对的, 因为数据足够相似,也可能会陷入局部最小值)
101101def kMeans (dataSet , k , distMeas = distEclud, createCent = randCent):
102102 m = shape(dataSet)[0 ] # 行数
@@ -132,10 +132,10 @@ def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
132132
133133### K-Means 聚类算法的缺陷
134134在 kMeans 的函数测试中,可能偶尔会陷入局部最小值(局部最优的结果,但不是全局最优的结果).
135- 所以为了客户 KMeans 算法收敛于局部最小值的问题,有更厉害的大佬提出了另一个称为二分K-均值(bisecting K-Means)的算法.
135+ 所以为了克服 KMeans 算法收敛于局部最小值的问题,有更厉害的大佬提出了另一个称为二分K-均值(bisecting K-Means)的算法.
136136
137137### 二分 K-Means 聚类算法
138- 该算法首先将说有点作为一个簇 ,然后将该簇一分为二。
138+ 该算法首先将所有点作为一个簇 ,然后将该簇一分为二。
139139之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于对其划分时候可以最大程度降低 SSE(平方和误差)的值。
140140上述基于 SSE 的划分过程不断重复,直到得到用户指定的簇数目为止。
141141
@@ -170,7 +170,7 @@ def biKMeans(dataSet, k, distMeas=distEclud):
170170 sseSplit = sum (splitClustAss[:,1 ]) # 将二分 kMeans 结果中的平方和的距离进行求和
171171 sseNotSplit = sum (clusterAssment[nonzero(clusterAssment[:,0 ].A!= i)[0 ],1 ]) # 将未参与二分 kMeans 分配结果中的平方和的距离进行求和
172172 print " sseSplit, and notSplit: " ,sseSplit,sseNotSplit
173- if (sseSplit + sseNotSplit) < lowestSSE:
173+ if (sseSplit + sseNotSplit) < lowestSSE: # 总的(未拆分和已拆分)误差和越小,越相似,效果越优化,划分的结果更好(注意:这里的理解很重要,不明白的地方可以和我们一起讨论)
174174 bestCentToSplit = i
175175 bestNewCents = centroidMat
176176 bestClustAss = splitClustAss.copy()
0 commit comments