2017-08-11 81 views
2

我正在谷歌云平台ml引擎上的sklearn实现一个简单的k最近邻算法。我使用自定义度量来计算两个输入向量之间的距离,以便距离是两个向量之间的元素平方差中元素的加权和。该代码是下面:真的与这种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

weight是一个长度为13的列表。我将自定义度量函数mydist放入KNeighborsRegressor的实例化中的度量参数中。 –

回答

0

您正在考虑错误条款之间的距离。你不能把标签和火车功能之间的距离。这些是两个不同的方面。您需要计算任意两个特征点之间的距离,比如x1和x2,,而不是标签和它的特征点(比如x1和y1)之间的距离。其次,在声明KNeighborsRegressor对象时,您指定了错误的参数。在'metric'参数中,您指定'string'或'DistanceMetric'对象。 首先,您必须制作一个距离度量对象,然后将其作为度量标准传递。所以,这是你的调用函数的正确方法:

my_metric=DistanceMetric.get_metric('myfunc',func=mydist) 
knn = neighbors.KNeighborsRegressor(weights='distance', n_neighbors=20, metric='myfunc') 

Sklearn本身将采取的参数是如何在距离函数传递关怀。我假设权重变量是全局的,您的代码才能正常运行。

+0

那么,我应该如何修改我的自定义度量函数以计算两个输入x1,x2之间的加权元素平方差? –

+0

我认为您的自定义指标定义是正确的。您只需要将其变成如上所示的示例的DistanceMetric对象,并将其传递到KNeighborsRegressor对象。 –

+0

感谢您的帮助! –