2017-03-18 11 views
0

割り当てとして、私は自分のkNNクラシファイアをforループを使用せずに作成する必要があります。私はscipy.spatial.KDTreeを使用して、テストセット内の各ベクトルの最近隣を見つけました。次に、scipy.stats.modeを使用して予測クラスのリストを返します。しかし、セットのサイズが非常に大きい場合、これは非常に長くかかる。例えば、私はthis pagekNNクラシファイアの性能(スピード)向上

import numpy as np 
from sklearn.model_selection import train_test_split 
from scipy import spatial 
from scipy.stats import mode 

def predict(X_test): 
    X = Y_train[tree.query(X_test, k=k)[1]] 
    Y = mode(X, axis=-1)[0].T[0] 
    return Y 

def load_data(): 
    x1 = 1.5 * np.random.randn(100) + 1 
    y1 = 1.5 * np.random.randn(100) + 2 
    x2 = 1.5 * np.random.randn(100) + 3 
    y2 = 1.5 * np.random.randn(100) + 4 
    X = np.vstack((np.hstack((x1,x2)),np.hstack((y1,y2)))).T 
    y = 1.0*np.hstack((np.zeros(100), np.ones(100))) 
    return X, y 

if __name__ == '__main__': 
    X, y = load_data() 
    X_train, X_test, Y_train, Y_test = train_test_split(X, y) 

    k = 7 
    Z = predict(np.c_[xx.ravel(), yy.ravel()]) 
    Z = Z.reshape(xx.shape) 

に触発され、次の例を作成しましたこれはX = Y_train[tree.query(X_test, k=k)[1]]一部の(40〜60秒!)非常に長い時間がかかります。 の速度を向上させる方法はありますか?具体的な実装か、それを行う別の方法を考えるべきですか?たとえば、sklearnの実装は0.4秒しかかかりません。これは私の実装に比べて非常に速いです。

答えて

2

コードを数回読んでいたのに、KDTreeで、cKDTreeではないことがわかりました。後者はCythonで実装されています(単純なpythonとnumpyの代わりに)、あなたにはまともな高速化が必要です。

関連する問題