割り当てとして、私は自分の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秒しかかかりません。これは私の実装に比べて非常に速いです。