七、度量数据的相似性和想异性
生活随笔
收集整理的這篇文章主要介紹了
七、度量数据的相似性和想异性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.相似性和想異性度量
度量數據的相似性和相異性主要包括以下方面的內容:
- 數數據矩陣和相異性矩陣;
- 標稱屬性的臨近性度量;
- 二元屬性的臨近性度量;
- 數值屬性的相異性:閔科夫斯基距離
2 數據矩陣和相異性矩陣
- 數據矩陣
數據矩陣或稱對象-屬性結構:這種數據結構用關系表的形式或n×𝑝矩陣存放n個數據對象:
每行對應于一個對象。在記號中,我們可能使用𝑓作為遍歷p個屬性的下標。 - 相異性矩陣
相異性矩陣或稱對象-對象結構:存放n個對象兩兩之間的臨近度,通常用一個n×𝑛的矩陣表示:
相似性度量可以表示成相異性度量的函數。例如對于標稱數據:
3 標稱屬性的臨近性度量
- 標稱屬性臨近性
標稱屬性可以取兩個或多個狀態。例如,map_color是一個標稱屬性,他可以有比如說5狀態:紅、黃、綠、粉紅和藍。
設一個標稱屬性的狀態數目是M。這些狀態可以用字母、符號或者一組整數表示。這些整數只是用于數據處理,并不代表任何特點的順序。
m: 匹配的數目(即i和j取值相同狀態的屬性數) p: 刻畫對象的屬性總數 - 標稱屬性之間的相異性
假設我們有表2.2種中的樣本數據,不過只有對象標識符和屬性test-1是可用的,其中test-1是標稱的。
- 標稱屬性的相異性
由于我們只有一個標稱屬性test-1,我們令皮p=1,使得當對象i和j匹配時,d(i,j)=0,當對象不同時, d(i,j)=1。于是,我們得到:
相似性可以表示為:
4 二元屬性的臨近性度量
- 二元屬性
二元屬性只有兩種狀態:0或1,其中0表示該屬性不出現,1表示出現。我們可以使用對稱和非對稱二元屬性刻畫對象間的相異性和相似性度量。 - 對稱的二元屬性
- 非對稱的二元屬性
非對稱的二元屬性,兩個狀態不是同等重要的;如病理化驗的陽性(1)和陰性(1)結果。給定兩個非對稱的二元屬性,兩個都取值1的情況(正匹配)被認為比兩個都取值0(負匹配)的情況更有意義。
對于非對稱的二元屬性,兩個狀態不是同等重要的。此時,i與j的相異性表示為:
對象i與j之間的非對稱的二元相似性可以用下式計算:
5 數值屬性的相異性
5.1距離的計算
- 歐幾里得距離
- 曼哈頓距離
- 閔科夫斯基距離
其中,p是一個參量,p選取不同的值,表示不同的距離:
p=1時,表示曼哈頓距離;
p=2時,表示歐式距離;
p→∞ 時,表示切比雪夫距離
- 余弦相似性
對于稀疏矩陣,例比較文檔或針對給定的查詢詞向量對文檔排序,可以對文檔向量或詞頻向量計算余弦相似性計算文檔的相似距離。
6 代碼實戰
6.1 計算動物之間的閔科夫斯基距離
# 閔科夫斯基距離 def minkowskiDist(v1, v2, p):"""假設v1和v2是兩個等長的數值型數組返回v1和v2之間階為p的閔可夫斯基距離"""dist = 0.0for i in range(len(v1)):dist += abs(v1[i] - v2[i])**preturn dist**(1/p)6.2 計算動物之間的相似性
# 余弦相似度 def cos_sim(vector_a, vector_b):"""計算兩個向量之間的余弦相似度:param vector_a: 向量 a:param vector_b: 向量 b:return: sim"""vector_a = np.mat(vector_a)vector_b = np.mat(vector_b)num = float(vector_a * vector_b.T)denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)cos = num / denomsim = 0.5 + 0.5 * cosreturn sim7 完成代碼
# *-* coding:utf-8 *-* import numpy as np # 閔科夫斯基距離 def minkowskiDist(v1, v2, p):"""假設v1和v2是兩個等長的數值型數組返回v1和v2之間階為p的閔可夫斯基距離"""dist = 0.0for i in range(len(v1)):dist += abs(v1[i] - v2[i])**preturn dist**(1/p)# 余弦相似度 def cos_sim(vector_a, vector_b):"""計算兩個向量之間的余弦相似度:param vector_a: 向量 a:param vector_b: 向量 b:return: sim"""vector_a = np.mat(vector_a)vector_b = np.mat(vector_b)num = float(vector_a * vector_b.T)denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)cos = num / denomsim = 0.5 + 0.5 * cosreturn sim # 主方法 if __name__ == '__main__':rattle_snake = [1, 1, 1, 1, 0]dart_frog = [1, 0, 1, 0, 4]m_distance = minkowskiDist(rattle_snake, dart_frog, 2)c_distance = cos_sim(rattle_snake, dart_frog)print("閔科夫斯基距離: ", m_distance)tance = minkowskiDist(rattle_snake, dart_frog, 2)
c_distance = cos_sim(rattle_snake, dart_frog)
總結
以上是生活随笔為你收集整理的七、度量数据的相似性和想异性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 六、数据的基本统计描述
- 下一篇: 八、探索性数据分析——数字化探索