目的:將所關心的對象按照一定的規則或者標准,分成不同的類別,以便有針對性的進行進一步有效處理。(利用數理統計方法對數據的變量或者觀測進行分類)
1、概述
分類
- 模糊聚類:對象與類別的從屬關系是有一定概率的
- 非模糊聚類:屬於或者不屬於,聚類的對象為離散的
1.1 聚類分析方法比較
- 層次法(CLUSTER)
- 凝聚式:先將每個觀測都歸為一類,每次將最相似的2個類合並成一個新類,直到所有觀測都成為一個類或者到達設定條件停止(SAS中的層次法都是凝聚式)
- 分裂式:與凝聚式相反,先將所有觀測歸為一類,再按相似程度一分為二,直到每個觀測自成一類,或者達到設定條件停止
- 划分法
- 先指定某幾個類中心,通過計算每個樣本到中心的距離將其歸到最近的類,然后不斷調整類中心直到收斂。
- 衡量聚類分析好壞的標准:
- 同類間,對象高度相似
- 不同類間,對象幾乎沒有相似性
1.2 如何度量相似性
定義一個距離函數:距離越小 越相似,定義距離的合理與否,從根本上決定了聚類分析的效果。
常見的距離函數:
- 街區距離
- 歐式距離
- 閔可夫斯基距離
- 漢明距離
SAS允許用戶自定義距離函數,經距離函數計算的結果可以作為sas聚類分析過程的數據。
/*聚類分析 對10只股票的10到13年間的收益率進行聚類 1、首先計算每2只股票的距離*/ data work.stock; title "股票數據輸入"; length stock $3; input stock $ div_2010 div_2011 div_2012 div_2013; datalines; s1 8.4 8.2 8.4 8.1 s2 7.9 8.9 10.4 8.9 s3 9.7 10.7 11.4 7.8 s4 6.5 7.2 7.3 7.7 s5 6.5 6.9 7.0 7.2 s6 5.9 6.4 6.9 7.4 s7 7.1 7.5 8.4 7.8 s8 6.7 6.9 7.0 7.0 s9 6.7 7.3 7.8 7.9 s10 5.6 6.1 7.2 7.0 ; proc distance data=work.stock method=DCORR /*指定使用歐式距離*/ out=work.distdcorr; var interval(div_2010 div_2011 div_2012 div_2013); id stock; title "股票距離計算"; run; proc print data = work.distdcorr; title '打印work.distdcorr'; run;
2 層次法與划分法
2.1 使用過程FASTCLUS (划分法)實現K均值聚類法
划分法中最常用的是K均值聚類法。K均值聚類法的一個重要特點是算法收斂的時間和待分析數據的觀測數據成正比。K均值聚類法可以用來處理規模較大的數據。
K均值聚類法的步驟:
- 選定K個觀測作為K類的種子
- 讀入所有觀測,計算每個觀測與K個種子間的距離,並將觀測暫時歸類到其距離最近的種子所在的類
- 根據最新類的中的觀測,重新計算類的的中心
- 重復2-3步,直到收斂。至此所有K類的種子最終確定
- 再次讀入所有觀測,將每個觀測歸類到與其距離最近的種子所在的類,分類結束。
這里的K值是預估的,預估的方法有:
- 根據背景知識進行判斷
- 根據分類目標判斷,比如希望客戶被分成3-4類
- 作圖法:根據圖像來判斷
- 啟發式:先給出一個較大的K值,在聚類得到一個建議類數,然后根據這個建議類數,進行聚類分析直到K值穩定在某一個常數
種子的選擇從根本上決定類分類的好壞
SAS 通過proc fastclus 來實現K均值聚類,默認使用歐式距離來計算觀測之間的距離。
FASTCLUS具有以下特點:
- 適用於分析較大的數據集,100條以上
- 方差較大的變量對分析結果的作用也比較大。如果數據集變量方差之間的差異較大,可以考慮先對數據集進行標准
/*划分法與層次法*/ data sasuser.food_cal; set tmp1.food_cal; run; proc fastclus data=sasuser.food_cal maxc=5 /*運行生成分類數據的最大值,默認100*/ maxiter=10 /*重新計算聚類中心的最大迭代次數*/ out=work.clus; var kcal fat protein;/*三個變量進行聚類*/ title "使用fastclus 進行k均值聚類法分析"; run;
運行結果如下:
最終輸出數據集work.clus中可以看到每一條觀測所屬的具體類:
2.2使用過程CLUSTER實現層次法
SAS提供了11種層次法,可以通過指定proc cluster中的選項來實現,形式如下:
proc cluster中,使用不同的方法起聚類結果也會不一樣,總結如下:
1、在蒙特卡羅隨機模擬方法中,分類效果比較好的是“可變法”,分類效果比較差的是“MCQUITTY”和“最短距離法”
2、對離群點比較敏感的是“離差平方和”和“最長距離法”
3、對離群點比較不敏感的是“類平均法”和“重心法”
4、除了“最大似然法”之外,其他方法均支持距離數據集作為過程步的輸入
/*使用過程cluster實現層次法*/ data sasuser.nutrition; set tmp1.nutrition; run; proc cluster data=sasuser.nutrition outtree=work.tree /*使用類平均 層次法,輸出ccc的值,輸出偽f統計量和偽T統計量*/ method=ave ccc pseudo; var Magnesium_mg percent_water Protein_g Saturate_Fat_g; id food; title "使用類平均 層次法進行對營養成分進行聚類分析"; run;
下面分析下運行的結果:
cluster輸出了類平均聚類分析圖
還有聚類的歷史:
其中:第一列表示當前的聚類數,第二三列表示當前合並的聚類,第四列表示當前類包含的觀測數。第5-6列表示半偏R方和R方,R方越大表示類之間分的越開,聚類效果越好;若半偏R方較大,說明本次並類的效果不好,應該考慮聚類在上一步停止。第8列現實的是CCC(立方聚類條件)的值,ccc的峰值表示建議聚類數;第9列顯示的是偽F統計量,表示類與類之間的分離程度。越大表示分類效果越好。outtree=work.tree 生成類數據集用來生成樹形圖。
/*cluster以work.tree作為輸入,生成樹形圖*/ proc cluster data=work.distdcorr method=ward outtree=work.tree; id stock; run; axis1 order=(0 to 1 by 0.1); proc tree data=work.tree haxis=axis1 horizontal; height _rsq_; id stock; title "cluster以work.tree作為輸入生成樹形圖"; run;
axis1 order=(0 to 1 by 0.1) 定義了一條坐標軸的屬性,haxis=axis1使用該坐標軸,horizontal指定了輸出水平樹形圖。
height _rsq_ 指定了輸入數據集中的變量_rsq_作為橫軸,id為變量stock;