使用Python進行層次聚類(二)——scipy中層次聚類的自定義距離度量問題
阿新 • • 發佈:2019-01-05
今天,總結一下如何使用層次聚類演算法裡面的自定義距離度量
層次聚類上次已經總結過。
這次僅僅說明層次聚類的距離引數,這裡的距離引數可以使用自定義函式。
我們進入該函式的文件頁面我們看到linkage
的說明文件上面的函式scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean',optimal_ordering=False)
,傳入第一個引數是需要進行層次聚類的資料,這裡即可用使用開始讀取的資料變數df
,第二個引數代表層次聚類選用的方法,第三個引數代表距離計算的方法。
上次詳細介紹了前兩個引數,這次我們主要關注第三個引數,我們注意一下第三個引數的解釋如下:
metric : str or function, optional
The distance metric to use in the case that y is a collection of observation vectors; ignored otherwise.
See the pdist function for a list of valid distance metrics. A custom distance function can also be used.
指標:str或function,可選。
在y為觀測向量集合的情況下使用的距離度規;否則忽略。
檢視有效距離度量列表的pdist函式。還可以使用自定義距離函式。
直接傳遞字串就不說了,因為無非就是那幾種範數度量等方法,關鍵是這個函式可以自己定義距離。這就為我們進行層次聚類提供了很好的一個介面,因為這特點任務下,我們的距離不一定能夠使用已有的方法達到自己的需求。因此我進行了一些測試,最後得出自定義函式需要注意以下幾個方面:
- 函式傳入兩個引數:比如,自定義函式為:
def selfDisFuc(a,b):
- 傳入引數型別是
<class 'numpy.ndarray'>
- 傳入引數的維度必須一樣
- 返回值必須是一個代表距離的數
我這處理自定義函式時,因為處理的資料維度不一樣,最後只好找到最大維度的資料,然後將不一樣的所有
資料後面補上-1(我的資料中不會出現的一個數)
安照上面的三個規則,就能寫出自己需要的距離衡量函數了。