首先,按照您的計算方式計算您的配置文件。那麼關鍵的一步就是某種正常化。你可以將數字除以它們的總數,使得數字總和爲1,或者你可以將它們除以它們的歐幾里得範數,以使它們具有歐幾里得範數1.例如,使用總和歸一化,第一個簡檔將會成爲(四捨五入)
0.57, 0.29, 0.14
,並利用歐氏正常化,這將成爲
0.87, 0.44, 0.22
這將確保所有剖面,在相同的數字範圍表示,將採取「過於冗長的護理配置文件作者「。
下面是一個例子IPython的會話顯示如何通過行總和以及如何計算歸一化的行之間的歐幾里得距離來歸一化的行。你會發現,在規範化之後,配置文件1和3更接近,就像你期望的那樣。
In [22]: p = array([[4,2,1],[2,1,3],[2,1,0]])
In [23]: p
Out[23]:
array([[4, 2, 1],
[2, 1, 3],
[2, 1, 0]])
In [24]: p = p/p.sum(axis=1)[:,newaxis]
In [25]: p
Out[25]:
array([[ 0.57142857, 0.28571429, 0.14285714],
[ 0.33333333, 0.16666667, 0.5 ],
[ 0.66666667, 0.33333333, 0. ]])
In [26]: p.sum(axis=1)
Out[26]: array([ 1., 1., 1.])
In [27]: norm(p[0] - p[1]) # distance 1-2
Out[27]: 0.44543540318737401
In [28]: norm(p[0] - p[2]) # distance 1-3
Out[28]: 0.17817416127494959
In [29]: norm(p[1] - p[2]) # distance 2-3
Out[29]: 0.62360956446232352
最後,如果你想更加看重個人資料是否提到的一切,與其說它是如何經常提到它的興趣,你可以做歸一化之前的額外步驟:簡單地計算pow(x, alpha)
爲您的個人資料矢量中的每個元素x
,其中alpha
是介於0和1之間的參數。在這裏,1意味着像以前一樣的標準線性加權,並且當alpha使得α接近於0時,這意味着僅提及利息計數,而不是提及頻率。例如,對於alpha = 0.5
(以輪廓的平方根),我們得到:
In [32]: p = array([[4,2,1],[2,1,3],[2,1,0]])
In [33]: p = sqrt(p)
In [34]: p
Out[34]:
array([[ 2. , 1.41421356, 1. ],
[ 1.41421356, 1. , 1.73205081],
[ 1.41421356, 1. , 0. ]])
In [35]: p = p/p.sum(axis=1)[:,newaxis]
In [37]: norm(p[0] - p[1]) # distance 1-2
Out[37]: 0.2353133053319465
In [38]: norm(p[0] - p[2]) # distance 1-3
Out[38]: 0.27881275777438091
In [39]: norm(p[1] - p[2]) # distance 2-3
Out[39]: 0.51412606310632747
現在型材1和2是最接近的匹配,因爲我們更加強調的事實,他們都提到Python的,沒有那麼他們多頻繁地提到它。
好的。但是問題1呢?如何考慮常見功能和距離的數量? – Yantraguru
@Kognizant:這會照顧到這兩個問題。只需計算這些歸一化向量的距離即可。 – cfh
抱歉,但我不明白。請您詳細說明它如何解決第一個問題? – Yantraguru