k均值聚類算法(k-means clustering algorithm)是一種迭代求解的聚類分析算法
其步驟是,預將數據分為K組,則隨機選取K個對象作為初始的聚類中心,然後計算每個對象與各個種子聚類中心之間的距離,把每個對象分配給距離它最近的聚類中心。聚類中心以及分配給它們的對象就代表一個聚類。每分配一個樣本,聚類的聚類中心會根據聚類中現有的對象被重新計算。這個過程將不斷重複直到滿足某個終止條件。終止條件可以是沒有(或最小數目)對象被重新分配給不同的聚類,沒有(或最小數目)聚類中心再發生變化,誤差平方和局部最小。
聚類(clustering):就是根據數據的“相似性”將數據分為多類的過程。 評估兩個不同樣本之間的“相似性” ,通常使用的方法就是計算兩個樣本之間的“距離”。 使用不同的方法計算樣本間的距離會關係到聚類結果的好壞。
樣本間的距離計算常見的有:歐氏距離、曼哈頓距離、馬氏距離、夾角餘弦
我們需要用到的實驗數據:
python代碼詳細解讀:
import numpy as np
from sklearn.cluster import KMeans
def loaddata(filepath): #定義一個數據加載函數,輸入值為文件路徑,返回值為各類數據和對應省份名字
fr=open(filepath,'r')#以只讀方式打開
lines=fr.readlines()#讀取所有行
retdata=[]
retcityname=[]
for line in lines:
items=line.strip().split(",")#將讀取的數據刪去換行符'\\n',並用逗號分隔開
retcityname.append(items[0])#將第一項(城市名)添加到數組retcityname中
retdata.append([float(items[i])for i in range(1,len(items))])#將同一行內剩餘數據依次添加到retdata中,需要注意使用float[]進行類型轉化從而達到運算浮點數而不是字符型變量#
return retdata,retcityname
if __name__=='__main__':
data,cityname=loaddata('31省市居民家庭消費水平-city.txt')
km=KMeans(n_clusters=4)#創建kmeans分類器,指定聚類中心個數(分類類別數)為4#
label=km.fit_predict(data)#計算簇中心以及為簇分配序號
expenses=np.sum(km.cluster_centers_,axis=1)#聚類中心數據求和,求和方式為按行相加#
print(expenses)
CityCluster=[[],[],[],[]]#四類對應四組數據
for i in range(len(cityname)):
CityCluster[label[i]].append(cityname[i])#將每一類中的城市名添加至對應類別中#
for i in range(len(CityCluster)):
print("Expenses:%.2f"%expenses[i])
print(CityCluster[i])
運行結果:
閱讀更多 這裡有個小樂 的文章