X 1 : ( 2 , 10 ) , X 2 : ( 2 , 5 ) , X 3 : ( 8 , 4 ) , X 4 : ( 5 , 8 ) , X 5 : ( 7 , 5 ) , X 6 : ( 6 , 4 ) , X 7 : ( 1 , 2 ) , X 8 : ( 4 , 9 ) X_1:(2,10),X_2:(2,5),X_3:(8,4),X_4:(5,8),X_5:(7,5),X_6:(6,4),X_7:(1,2),X_8:(4,9) X1:(2,10),X2:(2,5),X3:(8,4),X4:(5,8),X5:(7,5),X6:(6,4),X7:(1,2),X8:(4,9)
初始点为 X 1 , X 4 , X 7 X_1,X_4,X_7 X1,X4,X7,试用k-means
聚类算法将其聚为三类
解:
首先给出距离公式
距离公式:
假设A点坐标为 ( X 1 , Y 1 ) (X_1,Y_1) (X1,Y1),B点坐标为( X 2 , Y 2 X_2,Y_2 X2,Y2)
Distance= ( X 1 − X 2 ) 2 + ( Y 1 − Y 2 ) 2 \sqrt{(X_1-X_2)^2+(Y_1-Y_2)^2} (X1−X2)2+(Y1−Y2)2 注:此为:欧几里得距离(Euclidean Distance)
参考机器学习中的数学——距离定义(一):欧几里得距离(Euclidean Distance)
X 1 ( 2 , 10 ) X_1(2,10) X1(2,10) | X 4 ( 5 , 8 ) X_4(5,8) X4(5,8) | X 7 ( 1 , 2 ) X_7(1,2) X7(1,2) | |
---|---|---|---|
X 1 ( 2 , 10 ) X_1(2,10) X1(2,10) | 0 | 3.6 | 8.1 |
X 2 ( 2 , 5 ) X_2(2,5) X2(2,5) | 5.0 | 4.2 | 3.2 |
X 3 ( 8 , 4 ) X_3(8,4) X3(8,4) | 8.5 | 5.0 | 7.3 |
X 4 ( 5 , 8 ) X_4(5,8) X4(5,8) | 3.6 | 0 | 7.2 |
X 5 ( 7 , 5 ) X_5(7,5) X5(7,5) | 7.1 | 3.6 | 6.7 |
X 6 ( 6 , 4 ) X_6(6,4) X6(6,4) | 7.2 | 4.1 | 5.4 |
X 7 ( 1 , 2 ) X_7(1,2) X7(1,2) | 8.1 | 7.2 | 0 |
X 8 ( 4 , 9 ) X_8(4,9) X8(4,9) | 2.2 | 1.4 | 7.6 |
注:以 X 8 X_8 X8为例:其与 X 4 X_4 X4最近,故将他们两个归为一类,这里的距离都保留的一位小数
中心点坐标=(x坐标的均值,y坐标的均值
即 X 1 X_1 X1为一类,中心点也就是它的坐标(2,10)
X 4 , X 3 , X 5 , X 6 , X 8 X_4,X_3,X_5,X_6,X_8 X4,X3,X5,X6,X8为一类,
中心点坐标( 8 + 5 + 7 + 6 + 4 5 , 4 + 8 + 5 + 4 + 9 5 \displaystyle\frac{8+5+7+6+4}{5},\displaystyle\frac{4+8+5+4+9}{5} 58+5+7+6+4,54+8+5+4+9)等于(6,6)X 7 , X 2 X_7,X_2 X7,X2为一类同理中心点为(1.5,3.5)
(2,10) | (6,6) | (1.5,3.5) | |
---|---|---|---|
X 1 X_1 X1 | 0 | 5.7 | 6.5 |
X 2 X_2 X2 | 5.0 | 4.1 | 1.6 |
X 3 X_3 X3 | 8.5 | 2.8 | 6.5 |
X 4 X_4 X4 | 3.6 | 2.2 | 5.7 |
X 5 X_5 X5 | 7.1 | 1.4 | 5.7 |
X 6 X_6 X6 | 7.2 | 2.0 | 4.5 |
X 7 X_7 X7 | 8.1 | 6.4 | 1.6 |
X 8 X_8 X8 | 2.2 | 3.6 | 6.0 |
同样的,X1,X8到(2,10)最近归为一类,中心点为(3,9.5)
X3,X4,X5,X6到(6,6)最近归为一类,中心点为(6.25.4.5)
X7,X2到(1.5,3.5)最近归为一类,中心点为(1.5.3.5)
3.第三步 ,重复上次动作,计算这个8个点到这三个中心点的距离
( 3 , 9.5 ) (3,9.5) (3,9.5) | ( 6.25.4.5 ) (6.25.4.5) (6.25.4.5) | ( 1.5.3.5 ) (1.5.3.5) (1.5.3.5) | |
---|---|---|---|
X 1 X_1 X1 | 1.1 | 7.0 | 6.5 |
X 2 X_2 X2 | 4.6 | 4.3 | 1.6 |
X 3 X_3 X3 | 7.4 | 1.8 | 6.5 |
X 4 X_4 X4 | 2.5 | 3.7 | 5.7 |
X 5 X_5 X5 | 6.0 | 0.90 | 5.7 |
X 6 X_6 X6 | 6.3 | 0.56 | 4.5 |
X 7 X_7 X7 | 7.8 | 5.8 | 1.6 |
X 8 X_8 X8 | 1.1 | 5.0 | 6.0 |
X 1 , X 4 , X 8 X_1,X_4,X_8 X1,X4,X8归为一类 中心点为 ( 3.66 , 9 ) (3.66,9) (3.66,9)
X 3 , X 5 , X 6 X_3,X_5,X_6 X3,X5,X6归为一类 中心点为 ( 7 , 4 ) (7,4) (7,4)
X 2 , X 7 X_2,X_7 X2,X7归为一类 中心点为 ( 1.5.3.5 ) (1.5.3.5) (1.5.3.5)
3.第四步 ,重复上次动作,计算这个8个点到这三个中心点的距离
( 3.66 , 9 ) (3.66,9) (3.66,9) | ( 7 , 4 ) (7,4) (7,4) | ( 1.5.3.5 ) (1.5.3.5) (1.5.3.5) | |
---|---|---|---|
X 1 X_1 X1 | 1.9 | 8.1 | 6.5 |
X 2 X_2 X2 | 4.3 | 5.5 | 1.6 |
X 3 X_3 X3 | 6.6 | 0.60 | 6.5 |
X 4 X_4 X4 | 1.7 | 4.7 | 5.7 |
X 5 X_5 X5 | 5.2 | 1.1 | 5.7 |
X 6 X_6 X6 | 5.5 | 1.4 | 4.5 |
X 7 X_7 X7 | 7.5 | 6.7 | 1.6 |
X 8 X_8 X8 | 0.34 | 6.0 | 6.0 |
X 1 , X 4 , X 8 X_1,X_4,X_8 X1,X4,X8归为一类 , X 3 , X 5 , X 6 X_3,X_5,X_6 X3,X5,X6归为一类 , X 2 , X 7 X_2,X_7 X2,X7归为一类
此时分类结果遇上一步分类一样,分类结束,上面就是最后的分类结果
说第“几”步其实不太对,这就是一个不停更新中心点的过程。。。。
最后附上代码
定义一个distance
的函数,这里就是计算每个点到坐标 ( x , y ) (x,y) (x,y)的距离
from sympy import *
def distance(x,y):
data=[[2,10],[2,5],[8,4],[5,8],[7,5],[6,4],[1,2],[4,9]]
for i in range(len(data)):
row=np.array([(N(sqrt( (data[i][0]-x)**2+(data[i][1]-y)**2),2)) for i in range(len(data))])
return row
# pd.DataFrame(distance(2,10),distance(2,10),distance(1,2))
list=[distance(3.66,9),distance(7.4,4),distance(1.5,3.5)]
Y=pd.DataFrame(list).T
Y.columns=["$X_1$", "$X_2$", "$X_3$"]
Y.index = ["$X_1$", "$X_2$", "$X_3$", "$X_4$",
"$X_5$","$X_6$", "$X_7$","$X_8$"]
写的时候发现一篇文章k-means算法例题应用也是类似的题目