python實現K means演算法(步驟詳細)

2021-10-06 05:12:35 字數 2262 閱讀 6494

實驗結果

演算法思想

選擇k個點作為初始質心  

repeat

將每個點指派到最近的質心,形成k個簇

重新計算每個簇的質心

until 簇不發生變化或達到最大迭代次數

學生姓名

小測1小測2

小測3期末成績

專案答辯

成績張三

1215

132824?

李四71110

1921?王五

1214

112723?

趙六674

1320?劉七

1314

132725?

1. 資料準備

2. kmeans演算法實現

def

k_means

(c, data,

max,label)

:# a. 輸入質心列表c,待聚類資料`data`,最大迭代次數max

max=

max-

1 num =

len(data)

# b. 計算data中的每個點分到k個質心的距離,得到乙個矩陣,如

metrix =

[[euclidist(a, b)

for a in data]

for b in c]

print

(metrix)

# c. 比較矩陣同一列的數值大小,將對應的學生劃歸距離較短的質心所屬的類,將標籤儲存為列表

classifier =

for(d, e, f)

inzip

(metrix[0]

, metrix[1]

, metrix[2]

):m =

min(d, e, f)

if d == m:0]

)elif e == m:1]

)else:2

])print

(classifier)

# d. 重新計算質心的座標,新質心的座標=被劃歸同一類點的座標的平均值

n1, n2 =0,

0 c1 =[0

,0,0

,0,0

] c2 = c1

c3 = c1

for i in

range(0

, num)

:if classifier[i]

== label[0]

: c1 =

[a + b for

(a, b)

inzip

(c1, data[i])]

n1 = n1 +

1elif classifier[i]

== label[1]

: c2 =

[a + b for

(a, b)

inzip

(c2, data[i])]

n2 = n2 +

1else

: c3 =

[a + b for

(a, b)

inzip

(c3, data[i])]

c1 =

[a / n1 for a in c1]

c2 =

[a / n2 for a in c2]

c3 =

[a /

(num - n1 - n2)

for a in c3]

print

(max

)print

([c1,c2,c3]

)# e. 重複b~d,直到質心座標不再變化,或達到最大迭代次數

if c !=

[c1, c2, c3]

andmax

>0:

c =[c1, c2, c3]

print

(c) k_means(c, data,

max, label)

return classifier

3. 設定引數,呼叫函式,得到結果學生姓名

小測1小測2

小測3期末成績

專案答辯

成績張三

1215

132824a

李四71110

1921b王五

1214

112723c

趙六674

1320b劉七

1314

132725a

kmeans演算法(python實現)

import numpy as np import matplotlib.pyplot as plt initialize center函式通過使用numpy庫的 zeros函式和random.uniform函式,隨機選取 了k個資料做聚類中心,並將結果存放在 了k個資料做聚類中心,並將結果存放在 ...

python簡易實現k means

用dist存放所有資料到中心的距離,有n行 n組資料 k 1列 前k列分別存放到第i個類中心的距離,最後一列存放分到了第幾類 usr bin env python coding utf 8 import numpy as np n 100 x np.arange 100 y np.arange 20...

k means演算法實現python

import numpy as np import matplotlib.pyplot as plt 兩點距離 defdistance e1,e2 return np.sqrt e1 0 e2 0 2 e1 1 e2 1 2 集合中心 defmeans arr return np.array np....