from numpy import *
def load_data(file_name):
data=
fr=open(file_name)
for line in fr.readlines():
cur_line=line.strip().split('\t')
flt_line=map(float,cur_line)
return data
def distance(a,b):
'''計算倆向量的歐式距離'''
return sqrt(sum(power(a-b,2)))
def rand_cent(data,k):
n=shape(data)[1]
#n資料的列數
centroids=mat(zeros((k,n)))
#初始質點矩陣,k為質點數
for j in range(n):
min_j=min(data[:,j])
#選出第j列中最小的數
range_j=float(max(data[:,j])-min_j)
#用j列中最大的減去最小的
centroids[:,j]=min_j+range_j*random.rand(k,1)
#獲得隨機質點,質點在資料範圍之內
return centroids
def k_means(data,k,distance=distance,create_cent=rand_cent):
'''k均值聚類演算法'''
m=shape(data)[0]
cluster_assment=mat(zeros((m,2)))
#cluster_assment第一列為質點,第二列為距離
centroids=create_cent(data,k)
cluster_changed=true
while cluster_changed:
cluster_changed=false
for i in range(m):
min_distance=inf;min_index=-1
#初始最小距離為正無窮,最小索引為-1
for j in range(k):
#j 相當於質點腳標
#k為4 ,則就有4個質點,j就是每個質點的腳標
dist_ji=distance(centroids[j,:],data[i,:])
#計算每個隨機質點與各資料的距離
if dist_ji
圖中紅色十字為二分法為質點,綠星味均值法質點。兩者能得到相同的結果。
樣本資料:
3.2751542.957587
-3.3444652.603513
0.355083-3.376585
1.8524353.547351
-2.0789732.552013
-0.993756-0.884433
2.6822524.007573
-3.0877762.878713
-1.565978-1.256985
2.4416110.444826
-0.6594873.111284
-0.459601-2.618005
2.1776802.387793
-2.9209692.917485
-0.028814-4.168078
3.6257462.119041
-3.9123631.325108
-0.551694-2.814223
2.8558083.483301
-3.5944482.856651
0.421993-2.372646
1.6508213.407572
-2.0829023.384412
-0.718809-2.492514
4.5136233.841029
-4.8220114.607049
-0.656297-1.449872
1.9199014.439368
-3.2877493.918836
-1.576936-2.977622
3.5981431.975970
-3.9773294.900932
-1.791080-2.184517
3.9146543.559303
-1.9101084.166946
-1.226597-3.317889
1.1489463.345138
-2.1138643.548172
0.845762-3.589788
2.6290623.535831
-1.6407172.990517
-1.881012-2.485405
4.6069993.510312
-4.3664624.023316
0.765015-3.001270
3.1219042.173988
-4.0251394.652310
-0.559558-3.840539
4.3767544.863579
-1.8743084.032237
-0.089337-3.026809
3.9977872.518662
-3.0829782.884822
0.845235-3.454465
1.3272243.358778
-2.8899493.596178
-0.966018-2.839827
2.9607693.079555
-3.2755181.577068
0.639276-3.412840
K 均值聚類
剛剛寫了篇分級聚類的,趁著餘熱,再寫一下關於k 均值聚類的。為了突出k 均值聚類的特點,先黑一下分級聚類。跟k 均值聚模擬起來,分級聚類演算法有一下缺點 第一,的那個沒有額外投入的時候,樹形試圖是不會真正將資料拆分成不同組的。第二,分級聚類的計算演算法計算量相當大。當兩個節點合併之後,節點之間的距離...
k均值聚類
k均值聚類就是利用歐氏距離的度量將距離相近的樣本分為k類 a.假設有m個樣本,首先隨機選擇k個樣本作為聚類的質心 要分成k類 b.然後對於每個樣本,計算它到每個質心的距離,將它歸類於距離最小的那個質心 c.接著對初步分類的k個類別重新計算該類的質心,也就是對每個類別的樣本座標求平均 d.重複 b 步...
k均值聚類演算法
輸入 簇的數目k和包含n個物件的資料庫。輸出 k個簇,使平方誤差準則最小。演算法步驟 1.為每個聚類確定乙個初始聚類中心,這樣就有k 個初始聚類中心。2.將樣本集中的樣本按照最小距離原則分配到最鄰近聚類 3.使用每個聚類中的樣本均值作為新的聚類中心。4.重複步驟2.3直到聚類中心不再變化。5.結束,...