簡體   English   中英

什么算法適合這種簡單的機器學習問題?

[英]What algorithms are suitable for this simple machine learning problem?

我有一個我認為是一個簡單的機器學習問題。

這是基本問題:我反復給出一個新對象和一個關於該對象的描述列表。 例如:new_object: 'bob' bob'new_object_descriptions: ['tall','old','funny'] 然后,我必須使用某種機器學習來查找具有10個或更少相似描述的先前處理的對象,例如,past_similar_objects: ['frank','steve','joe'] 接下來,我有一個算法可以直接測量這些對象是否確實類似於bob,例如,correct_objects: ['steve','joe'] 然后給分類器進行成功匹配的反饋訓練。 然后這個循環重復一個新對象。 這是偽代碼:

Classifier=new_classifier()

while True:
    new_object,new_object_descriptions = get_new_object_and_descriptions()
    past_similar_objects = Classifier.classify(new_object,new_object_descriptions)
    correct_objects = calc_successful_matches(new_object,past_similar_objects)
    Classifier.train_successful_matches(object,correct_objects)

但是,有一些規定可能限制可以使用的分類器:

  • 將有數百萬個對象放入此分類器中,因此分類和培訓需要能夠很好地擴展到數百萬個對象類型,並且仍然很快。 我認為這取消了類似垃圾郵件分類器的資格,這種分類器只適用於兩種類型:垃圾郵件或非垃圾郵件。 (更新:如果這是一個問題,我可以將其縮小到數千個對象而不是數百萬個。)

  • 再次,當數百萬個物體被分類時,我更喜歡速度,而不是准確性。

  • 更新:分類器應根據過去訓練的反饋返回10個(或更少)最相似的對象。 沒有這個限制,一個明顯的作弊將是分類器可以只返回所有過去的對象:)

為此目的,什么是體面的,快速的機器學習算法?

注意:calc_successful_matches距離度量計算起來非常昂貴,這就是為什么我使用快速機器學習算法來嘗試在實際進行昂貴的計算之前猜測哪些對象將會關閉。

一種似乎符合您要求的算法(可能與統計學家John建議的類似)是語義哈希 基本思想是它訓練一個深層次的信念網絡(一種神經網絡,有些人稱之為“神經網絡2.0”,現在是一個非常活躍的研究領域)來創建一個對象描述列表的哈希值。二進制數使得數字之間的漢明距離對應於相似的對象。 由於這只需要按位操作,因此它可以非常快,並且由於您可以使用它來創建最近鄰風格的算法,因此它自然地推廣到非常多的類。 這是非常好的先進技術。 缺點:理解和實施並不簡單,需要進行一些參數調整。 作者在這里提供了一些Matlab代碼。 一種更容易實現的算法,與此密切相關的是Locality Sensitive Hashing。

既然你說你有一個昂貴的距離函數,你想快速近似,我想起了另一個非常有趣的算法, Boostmap 這個使用增強來創建一個快速度量,它近似於計算度量的昂貴。 在某種意義上,它與上述想法類似,但所使用的算法是不同的。 本文的作者有幾篇關於相關技術的論文,這些論文都非常好(在頂級會議上發表)你可能想要查看。

您可以使用向量空間模型( http://en.wikipedia.org/wiki/Vector_space_model )。 我認為你要學習的是如何在考慮兩個對象描述向量彼此之間的距離時如何加權,例如在簡化的互信息方面。 這可能非常有效,因為您可以從術語哈希到向量,這意味着您不必比較沒有共享功能的對象。 然后,幼稚模型每個術語具有可調整的權重(這可以是每個術語每個術語,每個術語總體,或兩者),以及閾值。 向量空間模型是一種廣泛使用的技術(例如,在Apache Lucene中,您可能可以用於此問題),因此您將能夠通過進一步搜索找到很多相關信息。

讓我根據你的例子給出一個非常簡單的表述。 鑒於bob:['tall','old','funny'],我檢索

弗蘭克:['年輕','簡短,'有趣']史蒂夫:['高','老','脾氣暴躁']喬:['高','老']

因為我正在維持一個有趣的哈希 - > {frank,...},tall - > {steve,joe,...}和old - > {steve,joe,...}

我計算了一些類似於整體互信息的東西:共享標簽的重量/鮑勃標簽的重量。 如果該權重超過閾值,我將它們包含在列表中。

訓練時,如果我犯了錯誤,我會修改共享標簽。 如果我的錯誤包括坦率,我減輕了有趣的重量,而如果我犯了一個錯誤,不包括史蒂夫或喬,我增加了高老的重量。

您可以根據需要使其變得復雜,例如通過包含術語連詞的權重。

你真的需要機器學習算法嗎? 您的相似度量是多少? 您已經提到了對象數量的維數,每個人的特征集大小如何? 是否有最大數量的特質類型? 我可能會嘗試這樣的事情:

1)將字典映射到名為map的名稱列表

為每個人p

對於p中的每個特征

圖[T]。新增(P);

2)然后,當我想找到最親近的人時,我會拿起我的字典並創建一個新的臨時字典:

字典映射名稱計數稱為cnt

對於我感興趣的人的每個特質

對於地圖中的每個人p [t]

CNT [P] ++;

那么具有最高計數的條目最接近


這里的好處是地圖只創建一次。 如果每個人的特征很小,並且可用特征的類型很大,那么算法應該很快。

SVM非常快。 特別是LIBSVM for Python提供了支持向量機的非常好的實現,用於分類。

該項目以兩種顯着的方式脫離了典型的分類應用:

  • “分類器”不是輸出新對象被認為屬於的類(或者可能輸出這些類的數組,每個類具有概率/置信水平),而是提供“足夠接近”的“鄰居”列表。新的對象。
  • 對於每個新分類,獨立於分類器的目標函數提供正確的“鄰居”列表; 然后使用校正后的列表(分類器提供的列表的子集 ?)來訓練分類器

第二點背后的想法可能是提交給分類器並且與當前對象類似的未來對象應該更好地“分類”(與更正確的一組先前看到的對象相關聯),因為正在進行的訓練重新執行連接到正(正確)匹配,同時削弱與分類器最初出錯的對象的連接。

這兩個特征引入了明顯的問題。
- 輸出是對象列表而不是“原型”(或類別的類別標識符)這一事實使得難以擴展,因為到目前為止看到的對象數量增長到問題中建議的數百萬個實例。
- 訓練是在分類器找到的匹配子集的基礎上完成的事實,可能會引入過度擬合,從而分類器可能變得“盲”到特征(維度),它意外地沒有重量同樣重要/相關的,在培訓的早期階段。 (關於生成“正確”對象列表的目標函數,我可能會假設太多)

可能的是,縮放問題可以通過兩步過程來處理,使用第一個分類器,基於K-Means算法或類似的東西,這將產生整個對象集合的子集(先前看到的對象)作為似是而非的匹配對於當前對象(有效地過濾掉70%或更多的集合)。 然后,可以在矢量空間模型的基礎上評估這些可能的匹配(如果特征維度基於因子而不是值,則特別相關)或一些其他模型。 這個兩步過程的基本假設是對象集合將有效地暴露集群(它可能只是沿着各個維度相對均勻地分布)。

隨着先前看到的對象的大小增加,進一步限制要評估的候選者數量的另一種方法是刪除近似重復並且僅與其中一個進行比較(但是在結果中提供完整的重復列表,假設如果新對象接近這個近似重復類的“代表”,該類的所有成員也將匹配)

過度擬合的問題難以處理。 一種可能的方法是[有時]隨機地將對象添加到分類器通常不包括的匹配列表中。 額外的對象可以根據它們與新對象的距離相對距離來添加(即使得添加相對較近的對象的可能性更大)

你所描述的有點類似於Locally Weighted Learning算法,它給出了一個查詢實例,它在鄰近實例周圍訓練一個模型,加權由它們到查詢的距離加權。

Weka(Java)在weka.classifiers.lazy.LWL中實現了這一功能

可以使用深度學習。 http://www.deeplearning.net/tutorial/只需瀏覽此鏈接即可

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM