python筆記3——k-means
阿新 • • 發佈:2018-12-09
#資料處理 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()
'''
行轉列,做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()
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()