kmeans聚类,8个点分为三类

  • 已知有如下8个点:

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} (X1X2)2+(Y1Y2)2 注:此为:欧几里得距离(Euclidean Distance)
参考机器学习中的数学——距离定义(一):欧几里得距离(Euclidean Distance)

  1. 首先分别计算各点到 X 1 , X 4 , X 7 X_1,X_4,X_7 X1,X4,X7的距离如下如下 (比如 X 1 X_1 X1 X 1 X_1 X1的距离为0, X 1 X_1 X1 X 2 X_2 X2的距离为 ( 2 − 2 ) 2 + ( 10 − 5 ) 2 = 5 \sqrt{(2-2)^2+(10-5)^2}=5 (22)2+(105)2 =5)
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)

  1. 第二步,计算这个8个点到这三个中心点的距离
(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算法例题应用也是类似的题目

猜你喜欢

转载自blog.csdn.net/qq_54423921/article/details/131075831