2013-03-08 77 views
1

我是Mahout的新手,最近已經將很多我之前的機器學習代碼轉換爲此框架。在很多地方,我使用向量之間的餘弦相似度來進行聚類,分類等。然而,調查Mahout的distance method卻讓我頗感意外。在下面的代碼片段中,尺寸和浮點值從我的節目之一的實際輸出(不是在這裏事項)採取:Mahout中RandomAccessSparseVectors的餘弦距離

import org.apache.mahout.math.RandomAccessSparseVector; 
import org.apache.mahout.common.distance.CosineDistanceMeasure; 

public static void main(String[] args) { 
    RandomAccessSparseVector u = new RandomAccessSparseVector(373); 
    RandomAccessSparseVector v = new RandomAccessSparseVector(373); 
    u.set(24, 0.4526985183337534); 
    u.set(55, 0.5333219834564495); 
    u.set(54, 0.5333219834564495); 
    u.set(53, 0.4756042214095471); 

    v.set(57, 0.6653016370845252); 
    v.set(56, 0.6653016370845252); 
    v.set(11, 0.3387439495921685); 

    CosineDistanceMeasure cosineDistanceMeasure = new CosineDistanceMeasure(); 
    System.out.println(cosineDistanceMeasure.distance(u, v)); 
} 

輸出爲1.0。它不應該是0.0

將此與cosineDistanceMeasure.distance(u, u)的輸出相比較,我意識到我在尋找的是1 - cosineDistanceMeasure.distance(u, v)。但是這個反轉對我來說沒有意義。任何想法爲什麼這樣實施?或者我錯過了一些非常明顯的東西?

回答

1

當兩點「接近」時,它們在從原點看爲矢量時形成的角度很小,接近於零。接近零的角度的餘弦接近1,隨着角度朝向90°然後180°,餘弦減小。

所以餘弦隨着距離的增加而減小。這就是爲什麼兩個向量之間的角度的餘弦本身作爲距離度量沒有意義。制定距離度量的「規範」方法是1 - 餘弦;這是一個合適的指標。