2016-10-27 19 views
0

我使用的數據集包含大約200k個對象。每個對象都有4個特徵。我用K最近鄰(KNN)用歐幾里德度量對它們進行分類。過程在大約20秒鐘內完成。爲什麼KNN使用自定義指標變慢?

最近我有一個使用自定義指標的原因。可能它會取得更好的結果。我已經實施了自定義指標,KNN已經開始工作了一個多小時。我沒有等待完成它。

我認爲這個問題的原因是我的指標。我用return 1替換我的代碼。 KNN仍然工作了一個多小時。我認爲一個原因是算法球樹,但KNN與它和歐幾里得度量在大約20秒內工作。

現在我不知道什麼是錯的。我使用Python 3和sklearn 0.17.1。 Here過程無法使用自定義指標完成。我也試過算法brute,但它有相同的效果。 scikit-learn的升級和降級不起作用。在Python 2上按自定義度量標準實現分類也沒有正面影響。我在Cython上實現了這個度量(僅返回1),它具有相同的效果。

def custom_metric(x: np.ndarray, y: np.ndarray) -> float: 
    return 1 

clf = KNeighborsClassifier(n_jobs=1, metric=custom_metric) 
clf.fit(X, Y) 

我可以通過自定義指標提高KNN的分類過程嗎?

對不起,如果我的英語不清楚。

+2

用戶定義的函數在Python中並不是特別快;調用它們有很多開銷。您的自定義度量標準可能會取代在C中實現的某些內容。 – chepner

+0

KNN中具有歐幾里得度量的距離矩陣可以通過矩陣加法和乘法來實現(使用以下事實:|| ab ||^2 = || a ||^2 + || b ||^2 - 2 )高度優化和並行化(OpenBLAS,ATLAS或MKL) – damienfrancois

+0

另外,正如我上面所指出的,我已經在Cython上實現了度量標準,並且執行時間也很大。 @damienfrancois我沒有問題的歐幾里德度量。它是sklearn的標準度量。我嘗試使用自定義指標時出現性能問題。 我應該看看C/C++庫並在C/C++上重新實現我的程序嗎? – ANtlord

回答

0

正如@RédaBoumahdi指出的原因是使用python中定義的自定義指標。這是一個已知問題,討論here。在討論結束時它被關閉爲「wontfix」。因此,只有解決方案建議您在cython中編寫自定義指標,以避免GIL在使用python指標時速度變慢。