1. 程式人生 > >關於Rocchio分類演算法的總結與思考

關於Rocchio分類演算法的總結與思考

最近在做關於web分類的專案,要求用三個以上演算法分別實現,取TOP3,這個需要好好研究一番了。

除了Bayes(概率模型)、KNN(相似度模型)、SVM(非線性模型)等,發現還有個Rocchio演算法,以前沒有研究,查閱眾多文獻,都說分類效率高,但是效果不好,一般作為基準比較物件。~~~~於是決定研究一下,實實在在驗證一把,從基本概念開始。。。

一、概念

    Rocchio 演算法,是一種高效的分類演算法,廣泛地被應用到文字分類,查詢擴充套件等領域。它通過構造原型向量的方法得到最優解。Rocchio演算法是IR中通過查詢的初始匹配文件對原始查詢進行修改以優化查詢的方法。該演算法(Rocchio,1971)是20 世紀70 年代左右在Salton 的SMART 系統中引入並廣泛流傳的一種相關反饋演算法。

二、原理

    其基本思想是使用訓練集為每個類構造一個原型向量,構造方法如下:

    給定一個類,訓練集中所有屬於這個類的文件對應向量的分量用正數表示,所有不屬於這個類的文件對應向量的分量用負數表示,然後把所有的向量加起來,得到的和向量就是這個類的原型向量,定義兩個向量的相似度為這兩個向量夾角的餘弦,逐一計算訓練集中所有文件和原型向量的相似度,然後按一定的演算法從中挑選某個相似度作為界。給定一篇文件,如果這篇文件與原型向量的相似度比較大,則這篇文件屬於這個類,否則這篇文件就不屬於這個類。Rocchio演算法的突出優點是容易實現,計算(訓練和分類)特別簡單,它通常用來實現衡量分類系統性能的基準系統,而實用的分類系統很少採用這種演算法解決具體的分類問題

    其基本思想不難解釋,對於一個詞集,和一個分類,總有某些詞,這些詞一旦出現屬於這個分類的可能性就會增加,而另一些詞一旦出現屬於這個分類的可能性就會降低,那麼累計這些正面的,和負面的影響因素,最後由文件分離出的詞向量可以得到對於每個類的一個打分,打分越高屬於該類的可能性就越大.

    對於某種二分類特別合適, A, ~A, 任給一個文件,判斷屬於分類A還是分類~A,可以認為A的特徵項均給與正值,~A都給與負值,那麼給定一個合理閾值,就很容易做出這種型別的分類。

三、應用

文字分類

    Rocchio演算法應該算是人們思考文字分類問題時最先能想到,也最符合直覺的解決方法。基本的思路是把一個類別裡的樣本文件各項取個平均值(例如把所有 “體育”類文件中詞彙“籃球”出現的次數取個平均值,再把“裁判”取個平均值,依次做下去),可以得到一個新的向量,形象的稱之為“質心”,質心就成了這 個類別最具代表性的向量表示。再有新文件需要判斷的時候,比較新文件和質心有多麼相像(八股點說,判斷他們之間的距離)就可以確定新文件屬不屬於這個類。 稍微改進一點的Rocchio演算法不僅考慮屬於這個類別的文件(稱為正樣本),也考慮不屬於這個類別的文件資料(稱為負樣本),計算出來的質心儘量靠近正樣本同時儘量遠離負樣本。

查詢擴充套件

    Rocchio演算法是IR中通過查詢的初始匹配文件對原始查詢進行修改以優化查詢的方法。Rocchio 演算法是相關反饋實現中的一個經典演算法,它提供了一種將相關反饋資訊融到向量空間模型的方法。

       基本理論:假定我們要找一個最優查詢向量q ,它與相關文件之間的相似度最大且同時又和不相關文件之間的相似度最小。若Cr表示相關文件集,Cnr表示不相關文件集,那麼我們希望找到的最優的q 是:

[轉載]Rocchio演算法詳解

    sim 函式用於計算相似度。採用餘弦相似度計算時,能夠將相關文件與不相關文件區分開的最優查詢向量為:

[轉載]Rocchio演算法詳解

    這就是說,最優的查詢向量等於相關文件的質心向量和不相關文件的質心向量的差。然而,這個發現並沒有什麼意義,因為檢索本來的目的就是要找相關文件,而所有的相關文件集事先卻是未知的。

[轉載]Rocchio演算法詳解

  在一個真實的資訊檢索場景中,假定我們有一個使用者查詢,並知道部分相關文件和不相關文件的資訊,則可以通過如下公式得到修改後的查詢向量q:

[轉載]Rocchio演算法詳解

    其中, q 是原始的查詢向量,Dr 和Dnr 是已知的相關和不相關文件集合。α、β 及γ 是上述三者的權重。這些權重能夠控制判定結果和原始查詢向量之間的平衡:如果存在大量已判斷的文件,那麼會給β 及γ 賦予較高的權重。修改後的新查詢從q0 開始,向著相關文件的質心向量靠近了一段距離,而同時又與不相關文件的質心向量遠離了一段距離。新查詢可以採用常規的向量空間模型進行檢索。通過減去不相關文件的向量,我們很容易保留向量空間的正值分量。在Rocchio 演算法中,文件向量中的權重分量如果為負值,那麼該分量將會被忽略,也就是說,此時會將該分量權重設為0。下圖給出了應用相關反饋技術的效果示意圖。

[轉載]Rocchio演算法詳解

    相關反饋可以同時提高召回率和正確率。然而,實際表明該技術在一些重召回率的場景下對於提高召回率非常有用。這其中的部分原因在於它對查詢進行了擴充套件,另一個原因是應用的場景所帶來的結果:在期望高召回率的情況下,可以預計使用者可能會花更多時間來瀏覽結果並進行反覆搜尋。正反饋往往比負反饋更有價值,因此在很多IR系統中,會將引數設定成γ < β。一個合理的取值是α = 1、β = 0.75 及γ = 0.15。實際上,很多系統,都只允許進行正反饋,即相當於設定γ = 0。還有一種做法是,只取檢索系統返回結果中排名最高的標記為不相關的文件進行負反饋,此時,公式中的|Dnr| = 1。儘管上述相關反饋方法存在各種變形,並且很多比較實驗也沒有取得一致性的結論,但是一些研究卻認為一種稱為Ide dec-hi 的公式最有效或至少在效能上表現最穩定。Ide dec-hi 的公式如下:

[轉載]Rocchio演算法詳解

四、分類中兩個致命假設

1、它認為一個類別的文件僅僅聚集在一個質心的周圍,實際情況往往不是如此(這樣的資料稱為線性不可分的);

2、它假設訓練資料是絕對正確的,因為它沒有任何定量衡量樣本是否含有噪聲的機制,因而也就對錯誤資料毫無抵抗力。不過Rocchio產生的分類器很直觀,很容易被人類理解,演算法也簡單,還是有一定的利用價值的,常常被用來做科研中比較不同演算法優劣的基線系統(Base Line)。

以上是通過蒐集資料(百科、部落格的等)得到的概念解釋,然後就是實現、驗證:

(1)準備一些語料(包括65各類,每個類下樣本數不少於100);

(2)根據Rocchio演算法求出每個類質心;

(3)準備650個待測樣本,其實是進行的封閉測試(每個類去10個樣本組成的測試集);

(4)依次計算每個待測樣本和65個質心的距離(求均值),求出最相似的。

以上步驟就是中規中矩按照Rocchio基本思想進行的,最終分類結果如下:

(1)分類效率挺快,大概在5秒左右;

(2)分類結果只有11個類被分出來了(理論應該是每個類10個樣本);

效果真的好差。。。。

原因分析:

(1)正如大家總結的Rocchio的致命假設:訓練資料是絕對正確的,我的語料確實不是很正確,因為是人工分的,難免會有誤差;

(2)語料不均衡導致模型檔案有bias,樣本多的類更有優勢;

(3)認為一個類別的文件僅僅聚集在一個質心的周圍,實際情況往往不是如此(這樣的資料稱為線性不可分的)。

改進思路:

(1)以上1和2兩個問題;

(2)質心的獲得。需要用到特徵提取這個環節,特徵選擇的好壞對質心的質量也有很大影響;

(3)結合其他演算法(如KNN、SVM等),取長補短;

總之,Rocchio的提升空間還是有的,繼續研究,任重而道遠啊!