k-means算法以k為參數(shù),把n個對象分成k個簇,使簇內(nèi)具有較高的相似
度,而簇間的相似度較低。本文主要基于此算法對下圖2006年各地區(qū)城鎮(zhèn)居民家庭平均每人全年消費性支出進行分析玩讳,以了解各地消費層級的劃分
實現(xiàn)代碼如下:
import numpy as np
from sklearn.cluster import KMeans
import openpyxl
def loadData(filePath):
wb = openpyxl.load_workbook(filePath)
sh = wb.get_sheet_by_name('Sheet1')
retData = []
retCityName = []
for i in range(5, sh.max_row + 1):
retCityName.append(sh.cell(row=i, column=1).value)
retData.append([float(sh.cell(row=i, column=j).value) for j in range(2,sh.max_column + 1)])
return retData,retCityName
if __name__ == '__main__':
data,cityName = loadData('city.xlsx')
km = KMeans(n_clusters=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])
首先通過openpyxl類庫來讀取Excel中的文件嚼贡,將城市名稱和其它數(shù)據(jù)分別存入一個一維數(shù)據(jù)和二維數(shù)組中熏纯,然后調(diào)用KMeans方法,設置n_clusters參數(shù)粤策,即分類個數(shù)樟澜,對數(shù)據(jù)時行訓練,獲得標簽叮盘,最后對標簽進行輸出秩贰。輸出結果即將城市按照消費水平n_clusters類,消費水平相近的城市聚集在一類中柔吼。其中expense為聚類中心點的數(shù)值加和毒费,也就是平均消費水平。
當n_clusters=2時:
Expenses:7595.47
[' 天 津', ' 河 北', ' 山 西', ' 內(nèi)蒙古', ' 遼 寧', ' 吉 林', ' 黑龍江', ' 江 蘇', ' 安 徽', ' 福 建', ' 江 西', ' 山 東', ' 河 南', ' 湖 北', ' 湖 南', ' 廣 西', ' 海 南', ' 重 慶', ' 四 川', ' 貴 州', ' 云 南', ' 西 藏', ' 陜 西', ' 甘 肅', ' 青 海', ' 寧 夏', ' 新 疆']
Expenses:13841.98
[' 北 京', ' 上 海', ' 浙 江', ' 廣 東']
當n_clusters=3時:
Expenses:7204.11
[' 河 北', ' 山 西', ' 內(nèi)蒙古', ' 遼 寧', ' 吉 林', ' 黑龍江', ' 安 徽', ' 江 西', ' 山 東', ' 河 南', ' 湖 北', ' 湖 南', ' 廣 西', ' 海 南', ' 四 川', ' 貴 州', ' 云 南', ' 西 藏', ' 陜 西', ' 甘 肅', ' 青 海', ' 寧 夏', ' 新 疆']
Expenses:13841.98
[' 北 京', ' 上 海', ' 浙 江', ' 廣 東']
Expenses:9845.76
[' 天 津', ' 江 蘇', ' 福 建', ' 重 慶']
當n_clusters=4時:
Expenses:7214.42
[' 遼 寧', ' 安 徽', ' 江 西', ' 湖 北', ' 湖 南', ' 廣 西', ' 海 南', ' 四 川', ' 貴 州', ' 云 南', ' 西 藏']
Expenses:13841.98
[' 北 京', ' 上 海', ' 浙 江', ' 廣 東']
Expenses:9845.76
[' 天 津', ' 江 蘇', ' 福 建', ' 重 慶']
Expenses:7194.66
[' 河 北', ' 山 西', ' 內(nèi)蒙古', ' 吉 林', ' 黑龍江', ' 山 東', ' 河 南', ' 陜 西', ' 甘 肅', ' 青 海', ' 寧 夏', ' 新 疆']
當n_clusters=5時:
Expenses:9845.76
[' 天 津', ' 江 蘇', ' 福 建', ' 重 慶']
Expenses:7130.70
[' 河 北', ' 山 西', ' 內(nèi)蒙古', ' 吉 林', ' 黑龍江', ' 江 西', ' 山 東', ' 河 南', ' 貴 州', ' 陜 西', ' 甘 肅', ' 青 海', ' 寧 夏', ' 新 疆']
Expenses:12890.38
[' 浙 江', ' 廣 東']
Expenses:7318.30
[' 遼 寧', ' 安 徽', ' 湖 北', ' 湖 南', ' 廣 西', ' 海 南', ' 四 川', ' 云 南', ' 西 藏']
Expenses:14793.59
[' 北 京', ' 上 海']
從結果可以看出消費水平相近的省市聚集在了一類愈魏,例如聚4類時,消費最高的' 北 京', ' 上 海', ' 浙 江', ' 廣 東'聚集在了消費最高的類別觅玻,結果可以比較明顯的看出消費層級。