1. 程式人生 > >python筆記3——k-means

python筆記3——k-means

#資料處理
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from datetime import date,datetime
import numpy as np
from sklearn.cluster import KMeans #匯入K均值聚類演算法
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6 #rcParams設定好畫布的大小
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤

dir_path='E://DATA//'
outputfile = dir_path+'fenlei.csv'
data = pd.read_csv(dir_path+'full',sep='\x01',engine='python',header=None,names=[''], parse_dates=[''], infer_datetime_format=True,dtype={'':str,'':int}, encoding='utf-8')


#聚類
'''
演算法過程: 
1、從N個樣本資料中隨機選取K個物件作為初始的聚類質心。 
2、分別計算每個樣本到各個聚類中心的距離,將物件分配到距離最近的聚類中。 
3、所有物件分配完成之後,重新計算K個聚類的質心。 
4、與前一次的K個聚類中心比較,如果發生變化,重複過程2,否則轉過程5. 
5、當質心不再發生變化時,停止聚類過程,並輸出聚類結果。
'''
k = 5                       #需要進行的聚類類別數
iteration = 500             #聚類最大迴圈數
kmodel = KMeans(n_clusters = k, n_jobs = 4) #n_jobs是並行數,一般等於CPU數較好
kmodel.fit(data) #訓練模型
r1 = pd.Series(kmodel.labels_).value_counts()  #統計各個類別的數目
r2 = pd.DataFrame(kmodel.cluster_centers_)     #找出聚類中心
r = pd.concat([r2, r1], axis = 1) #橫向連線(0是縱向),得到聚類中心對應的類別下的數目
r.columns = list(data.columns) + ['類別數目'] #重命名錶頭
#詳細輸出原始資料及其類別
r1 = pd.concat([data, pd.Series(kmodel.labels_, index = data4.index)], axis = 1)
r1.columns = list(data.columns) + [u'聚類類別'] #重命名錶頭


#這個方法的聚類效果並不好,無法區分各個類別,棄用
from sklearn.manifold import TSNE
tsne = TSNE()
tsne.fit_transform(data4) #進行資料降維
tsne = pd.DataFrame(tsne.embedding_, index = data4.index) #轉換資料格式
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號
#不同類別用不同顏色和樣式繪圖
d = tsne[r1[u'聚類類別'] == 0]
plt.plot(d[0], d[1], 'y.')
d = tsne[r1[u'聚類類別'] == 1]
plt.plot(d[0], d[1], 'go')
d = tsne[r1[u'聚類類別'] == 2]
plt.plot(d[0], d[1], 'b*')
d = tsne[r1[u'聚類類別'] == 3]
plt.plot(d[0], d[1], 'c.')
d = tsne[r1[u'聚類類別'] == 4]
plt.plot(d[0], d[1], 'ro')
plt.show()

Clipboard Image.png

'''
行轉列,做x軸為省份 y軸為均值的聚類分佈圖
'''
data1=r1.copy()
data1=data1.reset_index().set_index(['聚類類別','sku_no']).stack().reset_index()
p=data1['province'].drop_duplicates().reset_index().drop('index',axis=1).reset_index().set_index('province')
dic_p=p['index'].to_dict()
#聚類後的類折線圖
data2=data1.copy()
data2['province']=data2['province'].map(dic_p)
plot_data=data2[['class','province','zb']].groupby(['class','province']).sum()
plot_data=plot_data.reset_index()
class_list=plot_data['class'].drop_duplicates().tolist()
for i,class_no in enumerate(class_list):
    mask_class=plot_data['class']==class_no
    plt.style.use('ggplot')
    plt.plot(plot_data['province'].loc[mask_class],plot_data['zb'].loc[mask_class])
    plt.xlabel('省份')
plt.show()

Clipboard Image.png

data3=data2[['class','province','sku_qty']].groupby(['class','province']).mean()
p_map=data9['province'].drop_duplicates().reset_index().set_index('province')
p_dict=p_map['index'].to_dict()
data3['province']=data3['province'].map(p_dict)
data3['class'].drop_duplicates()
class_list=data3['class'].drop_duplicates().tolist()
for i,class_no in enumerate(class_list):
    mask_c=data9['class']==class_no
    plt.xlabel('省份')
    plt.scatter(data3['province'].loc[mask_c],data3['sku_qty'].loc[mask_c])
plt.show()

Clipboard Image.png