#產生隨機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個類別中...