1. 程式人生 > >使用Python進行層次聚類(二)——scipy中層次聚類的自定義距離度量問題

使用Python進行層次聚類(二)——scipy中層次聚類的自定義距離度量問題

今天,總結一下如何使用層次聚類演算法裡面的自定義距離度量

層次聚類上次已經總結過。
這次僅僅說明層次聚類的距離引數,這裡的距離引數可以使用自定義函式。
我們進入該函式的文件頁面我們看到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(我的資料中不會出現的一個數)

,然後再處理。
安照上面的三個規則,就能寫出自己需要的距離衡量函數了。