2016-12-21 38 views
1

我使用Libsvm進行離羣點檢測(來自Java),但我需要的不是標籤的概率估計。我追溯了代碼,發現這是不可能的。特別是,在功能svm_predict_values(..)我看到以下代碼:單級svm是否提供概率估計?

if(model.param.svm_type == svm_parameter.ONE_CLASS) 
     return (sum>0)?1:-1; 
else 
     return sum; 

據我所知,一個類SVM嘗試從「正常」估計一些概率分佈給定樣本或數據點的支持類。給定一個新的數據點,並且假定模型已經學會了正常類分佈的支持,我可以估計新數據點是「正常」還是異常值?的概率。看來這是不可能的,這就是爲什麼Libsvm限制上述總和並只返回一個會員標籤,但我不明白爲什麼。如果可以從一個級別的svm獲得概率估計值,那麼在花費大量時間閱讀code後,我不會在Libsvm中看到如何做到這一點。

我走這個路線的原因是我不認爲核密度估計在高維設置中會工作得很好,但是也許svm很容易出現同樣的問題。

回答

1

據我所知,一個類SVM試圖從「正常」類

問題是,這句話是假的SVM估計一些概率分佈給出的樣本或數據點的支持。總的來說 - 是的,這將是一個很好的概率方法來建立一個分類器,採用邏輯迴歸,神經網絡等模型。然而,支持向量機不是其中之一,對支持向量機沒有適當的概率解釋,它並不真正構造概率分佈,而是直接尋找一個很好的決策規則。有更多的概率選擇,比如相關向量機(RVM),但是它們是非凸的。爲什麼二元SVM能夠爲您提供概率估計的唯一原因是因爲在許多實現中存在一個小的「欺騙」,起源於Platt,其中簡單地與SVM之上的另一個概率模型--通常是Logistic迴歸SVM投影。

那麼,你可以做什麼?您可以選擇其他更概率的模型,也可以使用類似的作弊方法,首先通過SVM(這是代碼提供的「sum」)投影數據,然後將Logistic迴歸放在它的頂部,這將是您的概率估計。

+0

好的,但libsvm提供了這個「作弊」的多類svm。所以問題是爲什麼沒有提供一流的svm? – Kai

+0

沒有在單類SVM中不使用它的數學原因,所以爲什麼它沒有實現?一個原因可能是這樣的事實,通常在一個類別中,分類概率估計是關於提供P(x | positive),而不是P(positive | x)(Platt縮放「欺騙」給你),並且沒有好方法在這些量之間進行轉換(因爲一類SVM不具有P(x)的模型)。但更可能的原因是「沒有足夠的人要求它」,因爲一類SVM是libsvm的一個小部分。 – lejlot

+0

好的,這是一個很好的答案。謝謝。在我的應用程序中,我實際上需要p(positive | x),所以如果爲libsvm提供了增強的Platt估計值(如果它是爲一個類提供的),那麼它將是完美的。但我確實找到了解決方法,這可能是答案。發現參數nu實質上是拒絕的訓練樣例比例的上限。因此,與那些被拒絕的訓練樣例(即使它們屬於正類)相比,新的測試點必須「接近」到「正常」或正面。這不完全是一個校準概率,但可以代替p(positive | x)。 – Kai