K means聚類演算法(python實現簡單原理)

2021-10-10 05:02:21 字數 3781 閱讀 8783

#產生隨機50個點

#這裡產生資料並儲存資料,不然每次資料總變來變去的,要是**寫得不當,也不太方便檢視

defproducte_data()

: f =

open

("data.csv"

,"w"

)for i in

range(50

):a = random.randint(1,

10)b = random.randint(1,

10)f.write(

str(a)

+','

+str

(b)+

'\n'

) f.close(

)def

read_data()

:#讀取資料

f =open

("data.csv"

) lines = f.readlines(

) f.close(

) l =

for line in lines:

line = line.strip(

'\n'

).split(

',')

l =[eval

(i)for i in line]

return l#所有點

defrandom_data

(l,k)

:#隨機產生中心點

random.seed(

250)

c =i =

0while i

c = random.choice(l)

#隨機選擇三個點

i = i+

1if c not

in c:

#如果產生一樣的隨機點

else

: i = i-

1return c#中心點

defsort_data

(l,c,n)

:#分類

dic =

#[座標,屬於類]

for line in l:

d =for i in

range

(len

(c))

: d =

((line[0]

-c[i][0

])**2

+(line[1]

-c[i][1

])**2

)**0.5(d,

tuple

(c[i]))

)#tuple(c[i])想作為字典的鍵,鍵不可變

near =

min(d)

#選出最近的點

if near[1]

notin dic:

dic[near[1]

]=[line]

else

: value = dic[near[1]

]#點分類

dic[near[1]

]= value

#算中心距離,尋找新的中心點

new_l =

for i in dic.items():

if n ==0:

sx =

0 sy =

0 coun =

0else

:

sx = i[0]

[0] sy = i[0]

[1] coun =

1#數這一類點的個數,方便再次產生新的中心點

for j in i[1]

: coun = coun+

1 sx = sx+j[0]

sy = sy+j[1]

sx = sx/coun

sy = sy/coun

[sx,sy]

)return new_l,dic

defdraw

(dic)

: color =

['pink'

,'blue'

,'green'

,'black'

,'purple'

,'yellow'

,'lightgrey'

] i =

0for value in dic.items():

c = color[i]

plt.scatter(value[0]

[0], value[0]

[1], color=c,s=

len(value[1]

)*10)

#聚類中心的點

for v in value[1]

: plt.scatter(v[0]

, v[1]

, color=c)

i = i+

1 plt.title(

"sorting position"

) plt.show(

)def

draw_begin

(l):

#展示初始狀態的點的分布

for value in l:

plt.scatter(value[0]

,value[1]

,color =

'black'

) plt.title(

"starting position"

) plt.show(

) producte_data(

)#隨機產生資料集

l = read_data(

)#l為所有點

draw_begin(l)

k =eval

(input

("請輸入想要將這些點分為類的個數:"))

c = random_data(l,k)

#c為中心點

n =0

new_l,dic = sort_data(l,c,n)

while

(n<

100)

:#限定條件1迭代次數為100

for i in

range

(k):

d =((l[i][0

]-new_l[i][0

])**2

+(l[i][1

]-new_l[i][1

])**2

)**0.5if d >1:

#限定條件2 新的聚類中心和之間的聚類中心誤差小於1

n = n+

1 new_l,dic = sort_data(l,new_l,n)

if d <1:

n =101draw(dic)

效果圖

因為資料是隨機產生的,如果不保持資料檔案,每次產生的效果都不同哦。

K Means聚類演算法

k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...

聚類演算法 K means

演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...

k means聚類演算法

說到聚類,得跟分類區別開來,分類是按人為給定的標準將樣本歸到某個類別中去,在機器學習中多是監督學習,也就是訓練樣本要給標籤 正確的類別資訊 而聚類是在某種規則下自動將樣本歸類,在機器學習中是無監督學習,不需要提前給樣本打標籤。k means聚類演算法,就是在某種度量方式下,將樣本自動劃分到k個類別中...