k-means 聚類算法思想先隨機(jī)選擇k個(gè)聚類中心,把集合里的元素與最近的聚類中心聚為一類,得到一次聚類,再把每一個(gè)類的均值作為新的聚類中心重新聚類,迭代n次得到最終結(jié)果分步解析
一、初始化聚類中心
首先隨機(jī)選擇集合里的一個(gè)元素作為第一個(gè)聚類中心放入容器,選擇距離第一個(gè)聚類中心最遠(yuǎn)的一個(gè)元素作為第二個(gè)聚類中心放入容器,第三、四、、、N個(gè)同理,為了優(yōu)化可以選擇距離開(kāi)方做為評(píng)判標(biāo)準(zhǔn)
二、迭代聚類
依次把集合里的元素與距離最近的聚類中心分為一類,放到對(duì)應(yīng)該聚類中心的新的容器,一次聚類完成后求出新容器里個(gè)類的均值,對(duì)該類對(duì)應(yīng)的聚類中心進(jìn)行更新,再次進(jìn)行聚類操作,迭代n次得到理想的結(jié)果
三、可視化展示
利用 python 第三方庫(kù)中的可視化工具 matplotlib.pyplot 對(duì)聚類后的元素顯示(散點(diǎn)圖),方便查看結(jié)果
python代碼實(shí)現(xiàn)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
import numpy as np import matplotlib.pyplot as plt # 兩點(diǎn)距離 def distance(e1, e2): return np.sqrt((e1[ 0 ] - e2[ 0 ]) * * 2 + (e1[ 1 ] - e2[ 1 ]) * * 2 ) # 集合中心 def means(arr): return np.array([np.mean([e[ 0 ] for e in arr]), np.mean([e[ 1 ] for e in arr])]) # arr中距離a最遠(yuǎn)的元素,用于初始化聚類中心 def farthest(k_arr, arr): f = [ 0 , 0 ] max_d = 0 for e in arr: d = 0 for i in range (k_arr.__len__()): d = d + np.sqrt(distance(k_arr[i], e)) if d > max_d: max_d = d f = e return f # arr中距離a最近的元素,用于聚類 def closest(a, arr): c = arr[ 1 ] min_d = distance(a, arr[ 1 ]) arr = arr[ 1 :] for e in arr: d = distance(a, e) if d < min_d: min_d = d c = e return c if __name__ = = "__main__" : ## 生成二維隨機(jī)坐標(biāo)(如果有數(shù)據(jù)集就更好) arr = np.random.randint( 100 , size = ( 100 , 1 , 2 ))[:, 0 , :] ## 初始化聚類中心和聚類容器 m = 5 r = np.random.randint(arr.__len__() - 1 ) k_arr = np.array([arr[r]]) cla_arr = [[]] for i in range (m - 1 ): k = farthest(k_arr, arr) k_arr = np.concatenate([k_arr, np.array([k])]) cla_arr.append([]) ## 迭代聚類 n = 20 cla_temp = cla_arr for i in range (n): # 迭代n次 for e in arr: # 把集合里每一個(gè)元素聚到最近的類 ki = 0 # 假定距離第一個(gè)中心最近 min_d = distance(e, k_arr[ki]) for j in range ( 1 , k_arr.__len__()): if distance(e, k_arr[j]) < min_d: # 找到更近的聚類中心 min_d = distance(e, k_arr[j]) ki = j cla_temp[ki].append(e) # 迭代更新聚類中心 for k in range (k_arr.__len__()): if n - 1 = = i: break k_arr[k] = means(cla_temp[k]) cla_temp[k] = [] ## 可視化展示 col = [ 'HotPink' , 'Aqua' , 'Chartreuse' , 'yellow' , 'LightSalmon' ] for i in range (m): plt.scatter(k_arr[i][ 0 ], k_arr[i][ 1 ], linewidth = 10 , color = col[i]) plt.scatter([e[ 0 ] for e in cla_temp[i]], [e[ 1 ] for e in cla_temp[i]], color = col[i]) plt.show() |
結(jié)果展示
總結(jié)
到此這篇關(guān)于k-means 聚類算法與Python實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)k-means 聚類算法python內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/qq_37509235/article/details/82925781