# -*- coding: utf-8 -*-
# 使用K-Means算法聚類消費行為特徵數據
import pandas as pd
# 參數初始化
input_path = 'F:/DataMining/chapter5/consumption_data.xls' # 銷量及其他屬性數據
output_path = 'F:/DataMining/chapter5/tmp/data_type.xls' # 保存結果的文件名
k = 3 # 聚類的類別
iteration = 500 # 聚類最大迭代次數
data = pd.read_excel(input_path, index_col='Id') # 讀取數據
print('data: \n', data)
print('means: \n', data.mean())
print('stds: \n', data.std())
data_zs = 1.0*(data - data.mean())/data.std() # 數據標準化
from sklearn.cluster import KMeans
model = KMeans(n_clusters=k, n_jobs=1, max_iter=iteration) # 分為k類,n_jobs=1即不並發執行
model.fit(data_zs) # 開始聚類
print('labels: \n', model.labels_)
print('cluster_centers_: \n', model.cluster_centers_)
# 簡單列印結果
r1 = pd.Series(model.labels_).value_counts() # 將數組格式的labels轉換為Series格式再統計各個類別的數目
# r1.index = ['a', 'b', 'c']
print('r1: \n', r1)
r2 = pd.DataFrame(model.cluster_centers_) # 將二維數組格式的cluster_centers_轉換為DataFrame格式
print('r2: \n', r2)
r = pd.concat([r2, r1], axis=1) # 橫向拼接接(0是縱向),將r1變成一列拼接在r2的最右邊,所有拼接的列的列名默認從0開始
r.columns = data.columns.tolist() + ['類別數目'] # 重命名表頭
print('r: \n', r)
# 詳細輸出原始數據及其類別
output_data = pd.concat([data, pd.Series(model.labels_, index=data.index)], axis=1) # 詳細輸出每個樣本對應的類別
output_data.columns = list(data.columns) + ['聚類類別'] # 重命名表頭
# output_data.to_excel(output_path) # 保存結果
# 使用TSNE進行數據降維並展示聚類結果
from sklearn.manifold import TSNE
tsne = TSNE()
tsne.fit_transform(data_zs) # 進行數據降維
# tsne.embedding_可以獲得降維後的數據
print('tsne.embedding_: \n', tsne.embedding_)
tsn = pd.DataFrame(tsne.embedding_, index=data.index) # 轉換數據格式
print('tsne: \n', tsne)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號
# 不同類別用不同顏色和樣式繪圖
color_style = ['r.', 'go', 'b*']
for i in range(k):
d = tsn[output_data[u'聚類類別'] == i]
# dataframe格式的數據經過切片之後可以通過d[i]來得到第i列數據
plt.plot(d[0], d[1], color_style[i], label='聚類' + str(i+1))
plt.legend()
plt.show()