1. 程式人生 > >使用python sklearn下的k_means聚類分析演算法時遇到的問題

使用python sklearn下的k_means聚類分析演算法時遇到的問題

#-*- coding: utf-8 -*-
#使用K-Means演算法聚類消費行為特徵資料

import pandas as pd

#引數初始化
inputfile = '../data/consumption_data.xls' #銷量及其他屬性資料
outputfile = '../tmp/data_type.xls' #儲存結果的檔名
k = 3 #聚類的類別
iteration = 500 #聚類最大迴圈次數
data = pd.read_excel(inputfile, index_col = 'Id') #讀取資料
data_zs = 1.0*(data - data.mean())/data.std() #資料標準化
from sklearn.cluster import KMeans model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分為k類,併發數4 model.fit(data_zs) #開始聚類 #簡單列印結果 r1 = pd.Series(model.labels_).value_counts() #統計各個類別的數目 r2 = pd.DataFrame(model.cluster_centers_) #找出聚類中心 r = pd.concat([r2, r1], axis = 1) #橫向連線(0是縱向),得到聚類中心對應的類別下的數目
r.columns = list(data.columns) + [u'類別數目'] #重命名錶頭 print(r) #詳細輸出原始資料及其類別 r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1) #詳細輸出每個樣本對應的類別 r.columns = list(data.columns) + [u'聚類類別'] #重命名錶頭 r.to_excel(outputfile) #儲存結果 def density_plot(data): #自定義作圖函式 import matplotlib.pyplot as
plt plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤 plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號 p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False) [p[i].set_ylabel(u'密度') for i in range(k)] plt.legend() return plt pic_output = '../tmp/pd_' #概率密度圖檔名字首 for i in range(k): density_plot(data[r[u'聚類類別']==i]).savefig(u'%s%s.png' %(pic_output, i))

這是一個很常見的案列的程式碼,但是我在跑的時候瘋狂報錯,錯誤資訊如下

ImportError: [joblib] Attempting to do parallel computing without protecting your import on a system that does not support forking. To use parallel-computing in a script, you must protect your main loop using "if __name__ == '__main__'". Please see the joblib documentation on Parallel for more information

大概就是一個平行計算的錯誤,因為案例裡建立模型時,定義了n_jobs=4,所以報錯,但是為什麼會產生這個錯誤我不太清楚,可能是在python3.6版本里原先的庫有的地方不相容吧。

解決方案:

將n_jobs=4刪掉就好