實驗結果
演算法思想
選擇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....