概念
- 聚類分析:是按照個體的特征將它們分類,讓同一個類別內的個體之間具有較高的相似度,不同類別之間具有較大差異性
- 無分類目標變量(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 ]
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 ]
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])
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 )
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)
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