R數據挖掘 第二篇:基於距離評估數據的相似性和相異性


聚類分析根據對象之間的相異程度,把對象分成多個簇,簇是數據對象的集合,聚類分析使得同一個簇中的對象相似,而與其他簇中的對象相異。相似性和相異性(dissimilarity)是根據數據對象的屬性值評估的,通常涉及到距離度量。相似性(similarity)和相異性(dissimilarity)是負相關的,統稱為臨近性(proximity)。

在聚類分析中,聚類算法的第一步都是度量數據集對象之間的距離,實際操作步驟是:對數據矩陣(用於存儲數據對象)進行無量綱化處理,應用距離算法,得到相異性矩陣(用於存放數據對象的相異性值)。

注意:在計算距離之前,首先對數據進行無量綱化處理。

一,數據矩陣和相異性矩陣

假設我們有n個對象(如人),被p個屬性(又稱維或特征,如年齡、身高、體重或性別)刻畫,這些對象記作x1=(x11,x12,…,x1p),x2=(x21,x22,…,x2p),等等,其中xij是對象xi的第j個屬性的值,對象xi也稱作對象的特征向量。把xi的集合叫做數據矩陣,各個對象之間的距離構成的矩陣,叫做相異性矩陣,通常情況下,常用的聚類算法都需要在這兩種數據結構上運行。

1,數據矩陣

數據矩陣(data matrix)或稱對象-屬性結構:這種數據結構用關系表的形式或n×p(n個對象×p個屬性)矩陣存放n個數據對象:

2,相異性矩陣

相異性矩陣(dissimilarity matrix)或稱對象-對象結構:存放n個對象兩兩之間的鄰近度(proximity),通常用一個n×n矩陣表示:

其中d(i,j)是對象i和對象j之間的相異性或“差別”的度量,一般而言,d(i,j)是一個非負的數值,對象i和j彼此高度相似或“接近”時,其值接近於0;而越不同,該值越大。注意,d(i,i)=0,即一個對象與自己的差別為0。此外,d(i,j)=d(j,i)。(為了易讀性,我們不顯示d(j,i),該矩陣是對稱的。)

數據矩陣由兩種不同類型的實體或“事物”組成,即行(代表對象)和列(代表屬性)。因而,數據矩陣經常被稱為二模(two-mode)矩陣。相異性矩陣只包含一類實體,因此被稱為單模(one-mode)矩陣。許多聚類和最近鄰算法都在相異性矩陣上運行,對於基於距離的相異性矩陣,可以使用stats包中的dist()函數把數據矩陣轉換為相異性矩陣。

二,數值屬性的距離度量

在聚類分析過程中,需要把數據對象區分為不同的類,那么對象是如何划分到不同的類別當中的呢?判斷不同對象是否歸於一類依據的是對象之間的相似性。對象相似性的度量標准一般有兩種:距離和相似性系數,距離一般用來度量觀測之間的相似性,而相似性系數,一般用來度量變量之間的相似性。
 
距離是指:把一個觀測看做M維空間中的一個點,並在空間中定義距離。基於距離的聚類算法是把距離較近的點可以歸入同一類,距離遠的點歸入不同的類 聚類分析中的距離一般用來測驗樣本之間的相似性,是進行聚類分析的關鍵步驟。 在聚類分析中,經常使用歐幾里得方法來計算數值屬性的相異性,歐幾里得是刻畫數據對象的相異性的距離度量,除了歐幾里得之外,還有切曼哈頓、蘭氏距離等方法。
 
蘭氏距離是一個無量綱的量,克服了閔可夫斯基距離與各指標的量綱有關的缺點,且蘭氏距離對大的離群點不敏感,這使其特別適合高度偏移的和數據,但蘭氏距離也沒有考慮變量間的相關性。閔科夫斯基距離和蘭氏距離都是假定變量之間相互獨立,即在正交空間中討論距離,但在實際問題中,變量之間往往存在着一定的相關性,為克服變量之間相關性的影響,可以采用馬氏距離。
下面列出6個常用的距離度量,除了馬氏距離之外,其他5個距離度量都需要做無量綱化處理。

1,歐幾里得距離

歐幾里得距離是聚類算法中最常用的距離度量,表示空間中兩點之間的直線距離

由於特征向量的各分量的量綱不一致,通常需要先對各分量進行標准化,使其與單位無關,比如,對身高(cm)和體重(kg)兩個單位不同的指標使用歐式距離可能使結果失效。

缺點:沒有考慮分量之間的相關性,體現單一特征的多個分量會干擾結果。

2,切比雪夫距離

切比雪夫距離是兩點投影到各軸上距離的最大值。以(x1,y1)和(x2,y2)二點為例,其切比雪夫距離為max(|x2-x1|,|y2-y1|)。

3,曼哈頓距離

表示城市中兩個點之間的街區距離,想象你在曼哈頓要從一個十字路口開車到另外一個十字路口,駕駛距離是兩點間的直線距離嗎?顯然不是,除非你能穿越大樓,實際駕駛距離就是曼哈頓距離,也稱為城市街區距離(City Block distance),例如,向南2個街區,橫過3個街區,共計5個街區。

4,蘭氏距離(Lance距離)

蘭氏距離克服了量綱的影響,但沒有考慮指標間的相關性。

通常蘭氏距離對於接近於0(大於等於0)的值的變化非常敏感。與馬氏距離一樣,蘭氏距離對數據的量綱不敏感。不過蘭氏距離假定變量之間相互獨立,沒有考慮變量之間的相關性。

5,閔科夫斯基距離(明氏距離)

閔科夫斯基距離需要用到參數p,

其中p是一個變參數,根據變參數的不同,閔氏距離可以表示一類的距離:

  • 當p=1時,就是曼哈頓距離
  • 當p=2時,就是歐氏距離
  • 當p→∞時,就是最大距離

閔氏距離的缺點主要有兩個:(1) 將各個分量的量綱(scale),也就是“單位”當作相同的看待了,(2) 沒有考慮各個分量的分布(期望,方差等)可能是不同的。

6,馬氏距離

馬氏距離表示數據的協方差距離,優點是量綱無關,考慮到變量(特性)之間的相關性,缺點是:不同的特征不能差別對待,可能誇大弱特征。

馬氏距離最典型的應用是根據距離做判別,假設有n個總體,計算某個樣品X歸屬於哪一類。此時雖然樣品X離某個總體的歐氏距離最近,但是未必歸屬它,比如該總體的方差很小,說明需要非常近才能歸為該類。對於這種情況,馬氏距離比歐氏距離更適合作判別。

使用R語言實現馬氏距離:

dist_mashi <-function(a,b){
return (((a-b)%*% t(t(a-b))) / cov(a,b))
}

三,類別屬性的相異性

類別屬性(也叫做標稱屬性)把數據分成有限的分組,如何計算類別屬性所刻畫的對象之間的相異性呢?兩個對象 i 和 j 之間的相異性可以根據不匹配率來計算:

其中,m是匹配的數目(即對象 i 和 j 取值相同的屬性數),而p是刻畫對象的屬性總數,我們可以通過賦予m較大的權重來增加m的影響。

例如,包含標稱屬性的表,只有一個標稱屬性,p值等於1,設置m值為1:

當對象i和j匹配時,相異度量 d(i, j)=0,當對象i和j不匹配時,相異度量 d(i, j)=1,得到相異矩陣:

四,混合類型屬性的相異性

如何計算混合屬性類型的對象之間的相異性?一種更可取的方法是:把所有屬性類型一起處理,把不同的屬性組合到單個相異性矩陣中,把所有有意義的屬性轉換到共同的區間 [0.0, 1.0] 上。

假設數據集中包含p個混合類型的屬性,對象i和j之間的相異性 d(i, j) 定義為:

 對數值屬性進行規范化處理,把變量值映射到區間[0.0, 1.0],使得所有的屬性值都映射到區間[0.0, 1.0],然后再計算數值屬性的距離。

五,文本相似性

兩個向量的夾角作為一種判別距離的度量。余弦相似度使用向量空間中兩個向量的夾角的余弦值來衡量兩個文本間的相似度,相比距離度量,余弦相似度更加注重兩個向量在方向上的差異,一般情況下,用Embedding得到兩個文本的向量表示之后,可以使用余弦相似度計算兩個文本之間的相似度。計算公式如下:

夾角余弦取值范圍為[-1,1],夾角余弦越大表示兩個向量的夾角越小,夾角余弦越小表示兩向量的夾角越大。當兩個向量的方向重合時夾角余弦取最大值1,當兩個向量的方向完全相反夾角余弦取最小值-1。應用場景,如文本分類時,兩文本之間距離計算。

六,R函數計算相異矩陣

使用R計算距離時,常用的函數是stats包中dist()和 cluster包中的daisy(),dist()用於計算數值屬性的相異性矩陣,而daisy()函數用於計算(對稱或非對稱)二元(binary)屬性、標稱(nominal)屬性、有序(ordinal)屬性、數值屬性和混合屬性的相異性矩陣。

1,使用dist()函數計算相異性矩陣

stats包中的dist()函數用於計算兩個數值型觀測值之間的距離:

dist(x, method = "euclidean", diag = FALSE, upper = FALSE, p = 2)

該函數計算並返回通過使用指定的距離度量計算的距離矩陣,以計算數據矩陣的行之間的距離。

參數注釋:

  • method:度量距離的方法,默認值是"euclidean",可用的方法是:"euclidean""maximum"、"manhattan"、"canberra"、"binary" 和"minkowski",中文名稱分別是:歐幾里得、最大距離、曼哈頓、蘭氏距離、二元距離和閔科夫斯基距離。
  • diag:邏輯值,是否繪制距離矩陣的對角線(diagonal)
  • upper:邏輯值,是否繪制距離矩陣的上三角(upper triangle)
  • p:用於閔科夫斯基距離,指定power值

dist()方法返回一個下三角矩陣,使用as.matrix()函數可以使用標准中括號得到距離。

d <- dist(x)
m <- as.matrix(d)

2,使用daisy()函數計算相異性矩陣

cluster包中的daisy()函數用於計算數據集中兩個觀測值之間的距離。當原始變量是混合類型,或者設置metric="gower"時,daisy()都會使用Gower公式計算數據集的相異型矩陣。

daisy(x, metric = c("euclidean", "manhattan", "gower"),
      stand = FALSE, type = list(), weights = rep.int(1, p), ...)

參數注釋:

  • x:數值矩陣或數據框,數值類型的變量被識別為區間縮放變量,因子類型的變量被識別為標稱屬性,有序因子被識別為有序變量,其他變量類型需要在type參數中指定。
  • metric:字符類型,有效值是  "euclidean" (默認值)、 "manhattan" 和 "gower"。
  • stand:邏輯值,在計算相異性之前是否按列對數據進行標准化
  • type:list類型,用於指定x中變量的類型,有效的列表項是"ordratio" (用於序數變量),、"logratio" (用於對數轉換)、"asymm" (用於非對稱二元屬性) 和"symm" (用於對稱二元屬性和標稱屬性).
  • weights:數值向量(長度是x的列的數量 p=ncol(x)),用於混合類型的變量(或 metric="gower"),指定每個變量的權重,默認的權重是1。

函數描述:

daisy()通過使用Gower相異系數(1971)來實現對標稱、序數和二元屬性數據的處理。如果x的變量是標稱、序數和二元類型的數據,那么函數將忽略metric和stand參數,使用Gower 系數計算數據矩陣的距離。對於純數值數據,也可以通過設置metric="gower"來計算相異性矩陣,計算的流程是先對數據對象進行標准化,標准化的算法是:(x-min)/(max-min),把數據縮放到范圍[0.0, 1.0]中。

 

參考文檔:

數據挖掘基礎:度量數據的相似性和相異性

相似性度量(距離及相似系數)

R語言:計算各種距離

數據挖掘:概念與技術--筆記1--度量數據的相似性與相異性


免責聲明!

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



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