我使用的數據集包含大約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的分類過程嗎?
對不起,如果我的英語不清楚。
用戶定義的函數在Python中並不是特別快;調用它們有很多開銷。您的自定義度量標準可能會取代在C中實現的某些內容。 – chepner
KNN中具有歐幾里得度量的距離矩陣可以通過矩陣加法和乘法來實現(使用以下事實:|| ab ||^2 = || a ||^2 + || b ||^2 - 2 )高度優化和並行化(OpenBLAS,ATLAS或MKL) – damienfrancois
另外,正如我上面所指出的,我已經在Cython上實現了度量標準,並且執行時間也很大。 @damienfrancois我沒有問題的歐幾里德度量。它是sklearn的標準度量。我嘗試使用自定義指標時出現性能問題。 我應該看看C/C++庫並在C/C++上重新實現我的程序嗎? – ANtlord