2016-01-15 70 views
0

我有大量的上下文向量,我想找到它們的平均餘弦相似度。但是,通過整套計算來計算效率並不高。這就是爲什麼,我想從這組中隨機抽取樣本。如何在java中實現一組向量的隨機採樣?

問題是,每個上下文向量解釋一個詞的意義程度,所以我想做一個平衡的選擇(根據向量值)。我搜索了一下,發現我可以使用蒙特卡洛方法。我還在這裏找到了一個Gibbs Sampler示例:https://darrenjw.wordpress.com/2011/07/16/gibbs-sampler-in-various-languages-revisited/

但是,我困惑了一下。據我所知,該方法提供了一個正態分佈並生成雙數。我不明白如何在我的情況下實施這種方法。有人可以解釋我怎麼解決這個問題?

在此先感謝。

+0

你如何定義「平衡」?每種定義的類似數量?基於類型的選擇概率?還有別的嗎? – Bohemian

+0

我的意思是一些向量爲目標詞定義更強的含義,而其他一些則定義較弱。例如,如果我主要從弱選項中進行選擇,它會在計算平均餘弦相似性時給我一個錯誤的結果。假設我將在2000年中選擇100個向量,我想從強和弱向量中挑選。一個更強的向量的例子:(100,43,80,15)和一個弱向量:(2,0,10,0)。 –

回答

0

你不想要一個隨機樣品,你想要一個代表樣品。一個相對有效的方法是按照「強度」順序對元素進行排序,然後取每個第n個元素,這會給你一個代表性的大小/ n元素樣本。

試試這個:

// Given 
Set<Vector> mySet; 
int reductionFactor = 200; // eg sample 0.5% of elements 

List<Vector> list = new ArrayList<>(mySet); 
Collections.sort(list, new Comparator<Vector> { 
    public int compare(Vector o1, Vector o2) { 
     // however you compare "strength" 
    }   
}); 
List<Vector> randomSample = new ArrayList<>(list.size()/reductionFactor); 
for (int i = 0; i < list.size(); i += reductionFactor) 
    randomSample.add(list.get(i); 

的時間複雜度爲O(n log n)的,由於排序操作,和空間複雜度爲O(n)。

+0

非常感謝@Bohemian –

0

該程序編譯並運行良好。它需要一個jar文件或者一個「Java Archive」來編譯和運行。具體來說,它需要ParallelColt庫,「一個多線程版本的Colt--一個用於Java中高性能科學計算的庫。」它可以在link找到。一旦擁有它,從Oracle獲得Java JDK(SE版本)。

複製你引用的源和parallelcolt-0.9.4.jar文件放到一個目錄,並編譯和這些命令運行:

javac -cp parallelcolt-0.9.4.jar Gibbs.java 

java -cp parallelcolt-0.9.4.jar;. Gibbs 

注意,你可能需要包括你的路徑上的編譯器。在Windows中,我這樣做:

path="c:\program files\java\jdk1.7.0_60\bin";%PATH% 

請選擇此答案作爲答案,如果它可以幫助你。

+0

我已經將cern.jet.random包導入我的項目並應用代碼。正如我在我的問題中所說的那樣,它會創建一個正態分佈並返回兩個數字。我不明白如何在我的情況下使用Gibbs採樣器。 –

+0

我不知道如何將此代碼應用於您的問題,對不起。 –

+0

沒關係,謝謝你的關注! –