真的与这个numpy形状不匹配错误相混淆

时间:2017-08-11 04:00:31

标签: python numpy scikit-learn

我在谷歌云平台ml引擎上实现了sklearn的简单k近邻算法。我使用自定义度量来计算两个输入向量之间的距离,使得距离是两个向量之间的元素方差的元素的加权和。代码如下:

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是一个numpy数组形状(86667,13),valid_dataset有形状(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。任何人都可以解释这里有什么问题吗?

1 个答案:

答案 0 :(得分:0)

你正在考虑错误术语之间的距离。您无法获取标签和火车功能之间的距离。这些有两个不同的维度。你需要计算任何两个特征点之间的距离,比如x1和x2,不在标签和它的特征点(比如x1和y1)之间。其次,在声明KNeighborsRegressor对象时,您已经错误地指定了参数。在“metric”参数中,您可以指定“string”或“DistanceMetric”对象。 首先,您必须制作距离指标对象,然后将其作为指标传递。所以,这是调用函数的正确方法:

abs
bsa
bsb
bsc

Sklearn本身将负责如何在距离函数中传递参数。我假设权重变量是全局的,以使代码正常运行。