2015-11-05 195 views
1

我正在開發一個Android應用程序,它使用來自手機的傳感器數據對活動進行分類。我也非常喜歡scikit-learn到任何Java機器學習庫。所以我使用Django創建了一個非常小的REST api,並且scikit學習使用支持向量機訓練傳感器數據並返回模型信息。在Android中使用受過訓練的Scikit-learn svm分類器

我的問題是:我如何使用scikit-learn在我的手機上生成的模型進行預測?到目前爲止,我已經考慮擴展api,以便每當手機要進行預測時,就會將數據發送到api以獲取一個。但我寧願能夠編寫一些Java代碼或使用Java庫來進行預測。向api發送培訓數據不是問題,因爲這不是實時完成的 - 只有在收集完數據後才能完成。然而,發送實時預測數據似乎不可行。

由於預測公式和模型參數非常簡單,用logistic迴歸做這件事情要容易得多,我可以放棄svms並使用它,但我也想要svms。

有人知道有人這樣做過嗎?是否有一種相對短時間的人可以做到這一點?沒有博士在數字計算或機器學習的方式來做到這一點?詳細步驟不是必需的,只是概述如何使用scikit-learn生成的svm組件。

+0

我假設你已經看到了這個:http://stackoverflow.com/questions/15625359/support-vector-machine-for-java –

回答

4

大多數支持SVM的軟件包(scikit-learn)都依賴於libsvm實現。但是你不需要libsvm的99%的代碼,你不需要博士學位,因爲在scikit-learn內部學習後你已經擁有了所有的參數。所有你需要的 - 在Java中任何簡單的線性代數庫(僅用於向量*向量操作)來實現決策功能。

如果您在SVC中使用線性內核 - 這相對容易,因爲scikit-learn會自動將所有這些複雜的雙係數和支持向量轉換爲簡單的超平面係數,因此決策函數變得與邏輯迴歸相當,您需要的全部內容 - 點產品 - 看這裏Exporting SVM classifiers from sklearn to Java codebase

在非線性內核的情況下 - 同樣只需要判定函數,但現在你必須瞭解什麼是支持向量,什麼是雙係數,什麼是內核,你必須在java中實現你的非線性內核。我認爲這是不容易的任務,實現決策函數的非線性SVC不理解SVC優化過程中是如何工作的,我給你一些鏈接:

  1. Layout of SVC attributes
  2. Decision Function
  3. Where all these dual coefficients and support vectors come from

或者您可以找到任何用於java的SVM庫,並使用您在SVC(C,eps等)中選擇的相同參數學習模型。我認爲這是非線性內核的最簡單解決方案。支持向量機是衆所周知的方法,我認爲使用相同的參數和數據集進行學習會給任何好的實現帶來同樣的結果(除了大多數實現和綁定,正如我所說的,依賴於libsvm,在這種情況下,平等是有保證的)。

+0

謝謝,這有助於。 –