import pandas as pd
import numpy as np
import xlrd
# 匯入資料
df2 = pd.read_excel(
"test2.xlsx"
)data = np.array(df2)
# 去掉前兩列
data = data[:,
2:]# 分為k類
k =3
# 臨近均值e
e =0.00001
# 獲得行數和列數
(row, line)
= data.shape
# 隨機分配中心點
datak = np.array(
[data[1,
:], data[2,
:], data[10,
:]])
# print(datak.shape)
# 初始化距離
d = np.zeros(
(k, row,1)
)while1:
for i in
range
(k):
# 與中心點做差
dev =
abs(data - datak[i]
)# 用曼哈頓距離求距離
d[i]
= np.
sum(dev, axis=
1, keepdims=
true
)# 返回最小值下標
mind = np.argmin(d, axis=0)
# 生成(row,0)秩
mind = np.array(mind[:,
0])# print(mind)
kx0 = np.where(mind ==0)
kx0 = np.array(kx0)
# print(kx0)
kx1 = np.where(mind ==1)
kx1 = np.array(kx1)
kx2 = np.where(mind ==2)
kx2 = np.array(kx2)
# print(kx2.shape)
kx = np.array(
[kx0[0]
, kx1[0]
, kx2[0]
])# print(kx[0])
# 計算中心點和誤差
# 初始化方差e
e = np.zeros((2
, k,1)
)for i in
range
(k):
# 獲取第i個物件的行數
linex = kx[i]
.shape
linex = linex[0]
# print(linex)
# 初始化第i個類包含的物件
# print(linex, line)
data_x1 = np.zeros(
(linex, line)
) data_x2 = np.zeros(
(k, linex, line)
)# print(data_x.shape)
for j in
range
(linex)
:# 每個物件和第i個中心點作差
data_x1[j]
=abs
(data[kx[i]
[j]]
-datak[i]
) data_x2[i, j]
= data[kx[i]
[j]]
# 求方差
e[0, i,0]
= np.
sum(np.
sum(data_x1**2)
)# print(data_x1.shape)
# print(i, e[0, i, 0])
# print(data_x2.shape)
# 更新第i類的中心點
# a = np.mean(data_x2, axis=0)
# print(a.shape)
datak[i]
= np.mean(data_x2[i]
, axis=0)
for j in
range
(linex)
:# 每個物件和第i個中心點作差
data_x1[j]
=abs
(data[kx[i]
[j]]
-datak[i]
) e[
1, i,0]
= np.
sum(np.
sum(data_x1 **2)
)# print(i, e[1, i, 0])
# print(data_x)
# print(datak[i])
# print(e[0, 0], e[1, 0], e[2, 0])
if e[0,
0,0]
-e[1,0
,0]<= e and e[0,
1,0]
-e[1,1
,0]<= e and e[0,
2,0]
-e[1,2
,0]<= e:
break
print
("success!"
)# 列印類和類中心
for i in
range
(k):
print
(kx[i]
.shape)
print
(kx[i]
)print
(datak[i]
)
測試資料 Kmean聚類演算法原理python實現
kmean聚類演算法是基於距離對物件進行分類的演算法,該演算法實現步驟如下 1 確定初始資料簇質心,質心的數量與需要分的類的數量一致 2 將資料集中的每乙個物件與不同質心計算距離,並將其分類到最近的質心簇中 3 更新資料簇質心,迭代計算,直到資料簇質心不再變化或者分類精度達到要求時,停止演算法。如下...
K mean聚類演算法
k mean演算法屬於非監督類演算法,模型相對簡單。目標函式 j sum dj i 演算法 1 初始化k個點 2 樣本xi,到k個點的距離為 dk xi uk j argmin j dk xi屬於cj 3 更新引數 uk sum xi i sum i 重複2和3,終止條件j的變化很小或者uk變化很小...
聚類及K mean演算法
首先什麼是聚類,和分類有什麼區別,這裡講乙個例子,比如有一群學生考完期末考試,現在要根據他們的成績把他們劃分成幾個小組,讓老師分別進行輔導,這時候,你不知道要劃分幾個小組比較好,但你可以根據他們的成績,比較成績接近的歸到乙個小組,這個過程就是聚類,另一種情況是直接給出了90分段的乙個小組,80分段的...