2017-08-11 22 views
2

私はGoogleのクラウドプラットフォームmlのエンジンのsklearnから簡単なのk最近傍アルゴリズムを実装したと混同します。私は2つの入力ベクトル間の距離を計算するカスタムメトリックを使用して、距離が2つのベクトル間の要素ごとの二乗差の要素の加重和であるようにしました。コードは以下である:は本当にこのnumpyの形状の不一致エラー

import os.path 
from sklearn import neighbors 
import numpy as np 
from six.moves import cPickle as pickle 
import tensorflow as tf 
from tensorflow.python.lib.io import file_io 

flags = tf.app.flags 
FLAGS = flags.FLAGS 
flags.DEFINE_string('input_dir', 'input', 'Input Directory.') 
flags.DEFINE_string('input_train_data','train_data','Input Training Data File Name.') 
pickle_file = os.path.join(FLAGS.input_dir, FLAGS.input_train_data) 

def mydist(x, y): 
    return np.dot((x - y) ** 2, weight) 

with file_io.FileIO(pickle_file, 'r') as f: 
    save = pickle.load(f) 
    train_dataset, train_labels, valid_dataset, valid_labels = save['train_dataset'], save['train_labels'], save[ 
     'valid_dataset'], save['valid_labels'] 

train_data = train_dataset[:1000] 
train_label = train_labels[:1000] 
test_data = valid_dataset[:100] 
weight = [1.0]* len(train_dataset[1]) 
knn = neighbors.KNeighborsRegressor(weights='distance', n_neighbors=20, metric=lambda x, y: mydist(x, y)) 
knn.fit(train_data, train_label) 
predict = knn.predict(test_data) 
print(predict) 

train_dataset形状(86667,13)とvalid_datasetのnumpyのアレイ形状(8000,13)を有しています。 Train_labelsには形状(86667,1)とvalid_labels(8000,1)があります。私は次元のミスマッチを得たいくつかの理由:

line 15, in mydist return np.dot((x - y) ** 2, weight) ValueError: shapes 
(10,) and (13,) not aligned: 10 (dim 0) != 13 (dim 0) 

カスタムメトリックの入力におけるxとyの両方がサイズ13を持っている必要があり、まだ何とか彼らはサイズ10を持っている誰もがここで間違っているかを説明することはできますか?

+0

「重量」の形状とは何ですか?また、私はKNeighborRegressor関数に慣れていませんが、どこでxとyを指定するのですか? – BenT

+0

重量は、私がKNeighborsRegressorのインスタンス化にメトリック引数にカスタムメトリック機能mydistを入れて長さ13とのリストです。 –

答えて

0

あなたは間違った用語間の距離を取っています。ラベルと列車の機能の間には距離を置くことはできません。これらは2つの異なる次元のものです。あなたは(X1とY1を言う)ラベルとそれの特徴点間、任意の2つの特徴点は、X1とX2を言うの間の距離を計算する必要はありません。第2に、KNeighborsRegressorオブジェクトを宣言するときに、パラメータを間違って指定しました。 'metric'パラメータでは、 'string'または 'DistanceMetric'オブジェクトを指定します。 まず、距離メトリックオブジェクトを作成して、メトリックとしてそれを渡す必要があります。したがって、関数を呼び出す正しい方法は次のとおりです。Sklearnは、距離関数でパラメータをどのように渡すかを自分で処理します。私は、あなたのコードが正しく機能するためには、変数weightsがグローバルであると仮定しています。

+0

したがって、2つの入力x1、x2間の重み付けされた要素ごとの二乗差を計算するために、カスタムメトリック関数を変更する必要がありますか? –

+0

カスタムメトリックの定義が正しいと思います。上記の例のようにDistanceMetricオブジェクトに変更し、KNeighborsRegressorオブジェクトに渡すだけで済みます。 –

+0

ご協力いただきありがとうございます! –

関連する問題