k means演算法實現python

2021-10-06 09:38:24 字數 2746 閱讀 6842

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.mean(

[e[0

]for e in arr]

), np.mean(

[e[1

]for e in arr])]

)# arr中距離a最遠的元素,用於初始化聚類中心

deffarthest

(k_arr, arr)

: f =[0

,0] max_d =

0for e in arr:

d =0for 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最近的元素,用於聚類

defclosest

(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__"

:## 生成二維隨機座標(如果有資料集就更好)

arr = np.random.randint(

100, size=

(100,1

,2))

[:,0

,:]# 取所有資料的第0列到最後一列資料,100是上限,預設下限為0

# print(arr)

## 初始化聚類中心和聚類容器

m =5 r = np.random.randint(arr.__len__()-

1)k_arr = np.array(

[arr[r]])

# 取到隨機乙個資料

print

(k_arr)

cla_arr =[[

]]for i in

range

(m-1):

k = farthest(k_arr, arr)

# print("k:",k)

k_arr = np.concatenate(

[k_arr, np.array(

[k])])

# 豎著拼接這兩個元素

# print("k_arr",k_arr)

)# print("cla:",cla_arr)

## 迭代聚類

n =20 cla_temp = cla_arr

for i in

range

(n):

# 迭代n次

for e in arr:

# 把集合裡每乙個元素聚到最近的類

ki =

0# 假定距離第乙個中心最近

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]

# 迭代更新聚類中心

for k in

range

(k_arr.__len__())

:if n -

1== i:

break

k_arr[k]

= means(cla_temp[k]

) cla_temp[k]=[

]print

(cla_temp)

## 視覺化展示

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(

)

K均值 KMeans 演算法原理機器python實現

根據k 均值演算法的工作流程,我們可以寫出偽 建立k個點作為初始質心 通常是隨機選擇 當任意乙個點的簇分配結果發生改變時 對資料集中的每個點 對每個質心 計算質心與資料點之間的距離 將資料點分配到據其最近的簇 對每個簇,計算簇中所有點的均值並將均值作為新的質心 直到簇不再發生變化或者達到最大迭代次數...

Kmeans演算法實現

include opencv2 highgui highgui.hpp include opencv2 core core.hpp include using namespace cv using namespace std static void help int main int argc ch...

K means演算法實現

import math import numpy class point data reader file name str def init self,file name point data reader.file name file name defget data list self,num...