Python數據挖掘—聚類—KMeans划分法


概念

  • 聚類分析:是按照個體的特征將它們分類,讓同一個類別內的個體之間具有較高的相似度,不同類別之間具有較大差異性
  • 無分類目標變量(Y)——無監督學習

K-Means划分法、DBSCAN密度法、層次聚類法

 

1、導入數據

 

 1 import pandas
 2 from sklearn.cluster import KMeans
 3 from sklearn.decomposition import PCA
 4 
 5 import matplotlib.pyplot as plt
 6 
 7 f=open("D:\\學習資料\\Python數據挖掘實戰課程課件\\7.1\\data.csv",encoding='UTF-8')
 8 data=pandas.read_csv(f)
 9 
10 fColumns=[
11     '工作日上班時電話時長', '工作日下半時電話時長', 
12     '周末電話時長', 
13     '國際電話時長', '總電話時長', '平均每次通話時長'
14 ]
View Code

2、確定特征變量,特征變量之間的相關系數,確定因變量,重新確定特征變量

 1 import matplotlib
 2 from pandas.tools.plotting import scatter_matrix
 3 
 4 font={
 5       "family":"SimHei"}
 6 
 7 matplotlib.rc("font",**font)
 8 matplotlib.rcParams["axes.unicode_minus"]=False
 9 
10 #%matplotlib qt
11 
12 scatter_matrix(
13         data[fColumns],
14         figsize=(10,10),diagonal="hist")
15 
16 
17 dCorr=data[fColumns].corr()
18 
19 
20 fColumns=[
21     '工作日上班時電話時長', '工作日下半時電話時長', 
22     '周末電話時長', 
23     '國際電話時長', '平均每次通話時長'
24 ]
View Code

3、降維、設定質心

 1 #降維
 2 pca_2=PCA(n_components=2)
 3 data_pca_2=pandas.DataFrame(
 4         pca_2.fit_transform(data[fColumns]))
 5 
 6 plt.scatter(
 7         data_pca_2[0],
 8         data_pca_2[1])
 9 
10 
11 kmModel=KMeans(n_clusters=3)
12 kmModel=kmModel.fit(data[fColumns])
View Code

4、對圖像分類並畫圖

 1 #對圖像進行分類
 2 pTarget=kmModel.predict(data[fColumns])
 3 
 4 pandas.crosstab(pTarget,pTarget)  #看每類別的個數
 5 
 6 
 7 plt.scatter(
 8         data_pca_2[0],
 9         data_pca_2[1],
10         c=pTarget
11         )
View Code

5、不同特征量之間的相關性

 1 dMean=pandas.DataFrame(columns=fColumns+["分類"])
 2 data_gb=data[fColumns].groupby(pTarget)
 3 
 4 i=0
 5 for g in data_gb.groups:
 6     print(g)
 7     rMean=data_gb.get_group(g).mean()    #rMean是一個series結構
 8     print(rMean)
 9     rMean["分類"]=g        #在最后追加一行
10     dMean=dMean.append(rMean,ignore_index=True)   #將series添加在dataframe中
11     subData=data_gb.get_group(g)  
12     for column in fColumns:
13         print(column)
14         i=i+1
15         p=plt.subplot(3,5,i)
16         p.set_title(column)
17         p.set_ylabel(str(g)+"分類")
18         plt.hist(subData[column],bins=20)
View Code

 

 

K—mans

k:聚類算法當中的個數

means:均值算法

K-Means:使用均值算法把數據分成K個類的算法

算法目標:

是把n個樣本點划分到k個類中,使得每個點都屬於離它最近的質心對應的類,以之作為聚類的標准

質心

是指一個類,內部所有樣本點的均值

 

計算步驟

第一步:取得K個初始質心:從數據中隨機抽取k個點作為初始聚類的中心,由這個中心代表各個類

 

第二步:把每個點划分進相應的類:根據歐式距離最小原則,把每個點划分配進距離最近的類中

第三步:重新計算質心:根據均值等方法,重新計算每個類的質心

 

第四步:迭代計算質心:重復第二步和第三部,迭代計算質心

第五步:聚類完成:聚類中心不再發生移動

 

 

 

fit_transform是fit和transform的組合。

 

 我們知道fit(x,y)在新手入門的例子中比較多,但是這里的fit_transform(x)的括號中只有一個參數,這是為什么呢?

fit(x,y)傳兩個參數的是有監督學習的算法,fit(x)傳一個參數的是無監督學習的算法,比如降維、特征提取、標准化

 

然后解釋為什么出來fit_transform()這個東西,下面是重點:

fit和transform沒有任何關系,僅僅是數據處理的兩個不同環節,之所以出來這么個函數名,僅僅是為了寫代碼方便,

所以會發現transform()和fit_transform()的運行結果是一樣的。

 

注意:運行結果一模一樣不代表這兩個函數可以互相替換,絕對不可以!!!

transform函數是一定可以替換為fit_transform函數的

fit_transform函數不能替換為transform函數!!!理由解釋如下:

 sklearn里的封裝好的各種算法都要fit、然后調用各種API方法,transform只是其中一個API方法,所以當你調用除transform之外的方法,必須要先fit,為了通用的寫代碼,還是分開寫比較好 

也就是說,這個fit相對於transform而言是沒有任何意義的,但是相對於整個代碼而言,fit是為后續的API函數服務的,所以fit_transform不能改寫為transform。

--------------------- 本文來自 陳士林 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/appleyuchi/article/details/73503282?utm_source=copy 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM