1. 程式人生 > >R語言學習(五)——聚類分析

R語言學習(五)——聚類分析

什麼是聚類分析

聚類是一個將資料集劃分為若干組(class)或類(cluster)的過程,並使得同一個組內的資料物件具有較高的相似度,而不同組中的資料物件是不相似的。

聚類與分類的區別:
聚類是一 種無監督的學習方法。與分類不同,它不依賴於事先確定的資料類別和標有資料類別的學習訓練樣本集合。
聚類是觀察式學習,而不是示例式學習。

聚類分析的典型應用
在商務上,聚類能幫助市場分析人員從客戶基本庫中發現不同的客戶群,並且用購買模式來刻畫不同的客戶群的特徵。在生物學上,聚類能用於推導植物和動物的分類,對基因進行分類,獲得對種群中固有結構的認識。聚類在地球觀測資料庫中相似地區的確定,汽車保險單持有者的分組,及根據房子的型別、價值和地理位置對一個城市中房屋的分組上也可以發揮作用。聚類也能用於對Web上的文件進行分類,以發現資訊。

什麼是好的聚類

一個好的聚類方法將產生以下的高聚類:

  • 最大化類內的相似性
  • 最小化類間的相似性

聚類結果的質量依靠所使用度量的相似性和它的執行。
聚類方法的質量也可以用它發現一些或所有隱含模式的能力來度量。

聚類分析中的資料型別

基本的資料結構

  1. 資料矩陣
    資料矩陣是一個物件—屬性結構,由n個物件組成,如:人;每個物件利用p個屬性加以描述,如:年齡、身高、體重等。資料矩陣採用關係表形式或n*p矩陣來表示:
    在這裡插入圖片描述
  2. 相異度矩陣
    相異度矩陣(又稱差異矩陣)是一個物件—物件結構,存放n個物件兩兩之間的近似性(差異性),採用n*n的矩陣形式表示:
    在這裡插入圖片描述

    其中,d(i,j)表示物件i和物件j之間的差異(或不相似程度)。通常d(i,j)為一個非負數;當物件i和物件j非常相似或彼此“接近”時,該數值接近0;該數值越大,就表示物件i和物件j越不相似,由於有d(i,j)=d(j,i)且d(i,i)=0。所以,矩陣呈現出上三角或下三角的形式。

注意:

  1. 資料矩陣通常稱為雙模(two-mode)矩陣:行和列分佈表示不同的實體;
  2. 相異度矩陣常被稱為單模(one-mode)矩陣:行和列表示同一實體。
  3. 許多聚類演算法都是以相異度矩陣為基礎計算的,所以如果資料是以資料矩陣的形式給出的,則需要首先轉換為相異度矩陣,才可以利用聚類演算法來處理。

區間標度變數

區間標度變數(又稱間隔數值變數)為基本呈直線比例的連續變數,如:重量、高度和溫度等。

  • 為什麼要標準化?

通常,選用的度量單位將直接影響聚類分析的結果,如:將高度的度量單位由“米”變為“英尺”,或將重量的單位由“千克”變為“英鎊”,可能會產生非常不同的聚類結構。一般來說,度量單位越小,變數可能的值域越大,對聚類結果的影響也越大。因此,為避免對度量單位選擇的依賴,資料應當標準化。

  • 度量值的標準化

為了實現標準化,一種方法是將初始測量值轉換為無單位變數。給定一個屬性變數f,可用如下公式對其進行標準化:

  1. 計算平均的絕對偏差
    在這裡插入圖片描述
  2. 計算標準化測量(z-score)
    在這裡插入圖片描述
    在標準化之後,或在無需標準化的特定應用中,由間隔數值所描述物件之間的差異(或相似)程度可以通過計算相應兩個物件之間距離來確定,最常用的距離計算公式是歐氏距離(Euclidean distance),其具體公式如下:
    在這裡插入圖片描述

R語言中求歐式距離
使用dist()函式

dist(x, method = "euclidean", diag = FALSE, upper = FALSE, p = 2)
#x是樣本矩陣或者資料框。
method表示計算哪一種距離:
euclidean                歐幾里德距離,即平方再開方。
maximum                  切比雪夫距離
manhattan                絕對值距離
canberra                 Lance 距離
minkowski                明科夫斯基距離,使用時要指定p值
binary                   定性變數距離.

例:
A的身高180cm,年齡25歲,有1萬存款
B的身高166cm,年齡30,有5萬存款
C的身高170cm,年齡45,有20萬存款
計算A、B、C的距離

將每個人的資料表示成向量

> a<-c(180,25,1) 
> b<-c(166,30,5) 
> c<-c(170,45,20)

形成資料矩陣

> mydata<-rbind(a,b,c)

為避免對度量單位選擇的依賴,將資料進行標準化

> mydatas<-scale(mydata)

求歐式距離

> mydist<-dist(mydatas,method="euclidean")

另一個常用的距離計算方法是曼哈頓距離(Manhattan distance),其計算公式如下:
在這裡插入圖片描述
Minkowski 距離是歐氏距離和曼哈頓距離的一個推廣,它的計算公式如下:
在這裡插入圖片描述
在這裡插入圖片描述

二元變數

  • 什麼是二元變數

一個二元變數只有兩個狀態:0或者1。其中0代表變數所表示的狀態不存在;1則代表相應的狀態存在。
如:給定變數smoker,用以描述一個病人是否吸菸的情況,如用smoker為1表示病人吸菸;若smoker為0表示病人不吸菸。

  • 二元變數的相異度計算

利用差異矩陣法。如果假設所有的二元變數有相同的權重,則可以得到一個兩行兩列(2*2)的條件表,如下:
在這裡插入圖片描述
其中:
q表示在物件i和物件j中均取1的二值變數個數;
r表示在物件i取1但物件j中取0的二值變數個數;
s表示在物件i中取0而在物件j中取1的二值變數個數;
t則表示在物件i和物件j中均取0的二值變數個數。
二值變數的總數為p,則:p=q+r+s+t。

R語言中二元變數的相異度計算
詳見我的另一篇文章:R語言——assignment3

聚類演算法

  • 系統聚類(層次聚類)
  • 基於劃分的k-means聚類

系統聚類
系統聚類的基本思想是將距離相近的樣品(或變數)先聚成類,距離相遠的後聚成類,過程一直進行下去,每個樣品(或變數)總能聚到合適的類中。

系統聚類過程是:假設總共有n個樣品(或變數)
第一步:將每個樣品(或變數)獨自聚成一類,共有n類;
第二步:根據所確定的樣品(或變數)“距離”公式,把距離較近的兩個樣品(或變數)聚合為一類,其它的樣品(或變數)仍各自聚為一類,共聚成n-1類;
第三步:將“距離”最近的兩個類進一步聚成一類,共聚成n-2類;……,以上步驟一直進行下去,最後將所有的樣品(或變數)全聚成一類。

這時,有兩個關鍵問題:

  • 類與類間的距離如何衡量?
  • 如何選擇分幾類呢?

類間距離
主要有最短距離法、最長距離法、類平均法、重心法。
它們的歸類步驟基本上是一致的,主要差異是類間距離的計算方法不同。

  1. 最短距離法
    定義類與類之間的距離為兩類中最近樣品(指標)的距離,即為:
    在這裡插入圖片描述
  2. 最長距離法
    定義類與類之間的距離為兩類最遠樣品的距離,即為:
    在這裡插入圖片描述
  3. 類平均法
    定義類與類之間的距離為兩類中任意兩樣品的距離的平均。
    在這裡插入圖片描述
  4. 重心法
    定義類間距離為兩類中心(各類樣品的均值)的距離。
    在這裡插入圖片描述

聚類分析的步驟
在這裡插入圖片描述
R語言下系統(層次)聚類
使用系統聚類法對如下幾個數進行聚類: 1,8,4,5,9,12
將這幾個數定義為一組向量

> mydata<-c(1,8,4,5,9,12)

使用dist()函式計算變數間距離,形成相異度矩陣

> mydist<-dist(mydata,method="euclidean")

使用hclust()進行聚類

> mymodel<-hclust(mydist)

畫出聚類模型圖

> plot(mymodel,labels=mydata)

得到下圖
在這裡插入圖片描述
指定聚為三類,並顯示結果

> result<-cutree(mymodel,3)
> mydata[which(result==3)]
[1] 12

K-平均(k-means)聚類演算法
K-平均(k-means)演算法以k為引數,把n個物件分為k個簇,以使簇內物件具有較高的相似度,而簇間的相似度較低。
相似度的計算根據一個簇中物件的平均值(被看作簇的重心)來進行。

k-means演算法的基本思想:
首先,隨機的選擇k個物件,每個物件初始的代表了一個簇的平均值;
對剩餘的每個物件,根據其與各個簇中心的距離,將它賦給最近的簇;
然後重新計算每個簇的平均值。這個過程不斷重複,直到準則函式收斂。

通常選擇均方差作為收斂準則函式:
在這裡插入圖片描述
k-means演算法的特點:
只適用於聚類均值有意義的場合,在某些應用中,如:資料集中包含符號屬性時,直接應用k-means演算法就有問題;
使用者必須事先指定k的個數;
對噪聲和孤立點資料敏感,少量的該類資料能夠對聚類均值起到很大的影響。