一起讀代碼_K-means-31省消費水平

k均值聚類算法(k-means clustering algorithm)是一種迭代求解的聚類分析算法

其步驟是,預將數據分為K組,則隨機選取K個對象作為初始的聚類中心,然後計算每個對象與各個種子聚類中心之間的距離,把每個對象分配給距離它最近的聚類中心。聚類中心以及分配給它們的對象就代表一個聚類。每分配一個樣本,聚類的聚類中心會根據聚類中現有的對象被重新計算。這個過程將不斷重複直到滿足某個終止條件。終止條件可以是沒有(或最小數目)對象被重新分配給不同的聚類,沒有(或最小數目)聚類中心再發生變化,誤差平方和局部最小。

聚類(clustering):就是根據數據的“相似性”將數據分為多類的過程。 評估兩個不同樣本之間的“相似性” ,通常使用的方法就是計算兩個樣本之間的“距離”。 使用不同的方法計算樣本間的距離會關係到聚類結果的好壞。

樣本間的距離計算常見的有:歐氏距離、曼哈頓距離、馬氏距離、夾角餘弦


一起讀代碼_K-means-31省消費水平


一起讀代碼_K-means-31省消費水平


一起讀代碼_K-means-31省消費水平


一起讀代碼_K-means-31省消費水平

我們需要用到的實驗數據:


一起讀代碼_K-means-31省消費水平

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])

運行結果:


一起讀代碼_K-means-31省消費水平


分享到:


相關文章: