Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x sklearn中的自定义度量_Python 3.x_Machine Learning_Scikit Learn - Fatal编程技术网

Python 3.x sklearn中的自定义度量

Python 3.x sklearn中的自定义度量,python-3.x,machine-learning,scikit-learn,Python 3.x,Machine Learning,Scikit Learn,我应该设计一个自定义度量,当使用不同的算法应用于MNIST时,它的性能超过L2 from sklearn import neighbors import utils import math # Extraction du dataset x_train, y_train = utils.get_train_data() x_test, y_test = utils.get_test_data() def EuclideanDistance(x, y): return math

我应该设计一个自定义度量,当使用不同的算法应用于MNIST时,它的性能超过L2

from sklearn import neighbors

import utils
import math


# Extraction du dataset
x_train, y_train = utils.get_train_data()
x_test,  y_test  = utils.get_test_data()

def EuclideanDistance(x, y):
    return math.sqrt((y[0] - x[0]) ** 2 + (y[1] - x[1]) ** 2)

test_range = 10
test_results = []  # tableau d'enregistrements {nn: [uniform, distance]}

for k in range(test_range):  # will test all 'k' values from 2 to 'test_range + 1'
    n_neighbors = k+2
    print("\nTesting  k =", n_neighbors)
    error_rate = []
    for weights in ['uniform', 'distance']:
        knn_clf = neighbors.KNeighborsClassifier(n_neighbors,
                                                 metric=EuclideanDistance,
                                                 weights=weights)
        knn_clf.fit(x_train, y_train)
        predictions = knn_clf.predict(x_test)

        error_rate.append(utils.count_error_rate(predictions, y_test))

    test_results.append({n_neighbors: error_rate})

print("\nResults:", test_results)
这样做,我得到以下结果:

Testing  k = 2
Error rate =      91.58316633266533 %
Error rate =      91.58316633266533 %

Testing  k = 3
Error rate =      91.58316633266533 %
Error rate =      91.58316633266533 %

Testing  k = 4
Error rate =      91.58316633266533 %
Error rate =      91.58316633266533 %

...

这显然是错误的。为什么我的自定义度量应用于不同的上下文时会得到相同的输出?

尝试使您的
欧几里德立场
函数独立于输入数据的长度(您的函数只查看了2个组件,而不是MNIST中的784个维度):

*编辑您对效率的评论

如果您转到pythons lib文件夹(/site packages/sklearn/metrics/pairwise.py),您可以看到函数是如何编写的。 但是,函数中的注释说明:

出于效率原因,一对行之间的欧几里德距离
向量x和y的计算公式为:

dist(x, y) = sqrt(dot(x, x) - 2 * dot(x, y) + dot(y, y))    
与传统配方相比,这种配方有两个优点 计算距离的其他方法。首先,它是计算上的 处理稀疏数据时效率高。第二,如果一个论点 变化,但另一个保持不变,然后
点(x,x)
和/或
点(y,y)
可以预先计算

但是,这并不是最精确的计算方法, 这个函数返回的距离矩阵可能不精确 对称的,例如,
scipy.space.distance
函数所要求的


您使用的“导入utils”是什么?看起来是自制的。另一点是,您没有显示数据。当您使用k=2 k=3和k=4时,是否有可能所有数据点的分类都相同?@florian
utils
用于加载仅为MNIST的数据集。当我使用sklearn给出的内置欧几里德度量时,我得到了不同的结果,这有助于我得出结论:在这种情况下,k=3似乎是最好的。然后我想更好地了解如何尝试我自己的自定义度量,所以我从一个欧几里德函数开始,但它对每个
k
都给出相同的结果。因此,我得出结论,我没有正确地实现自定义度量。我的问题是:如何使用sklearn实现自己的自定义度量?我找不到与此相关的文档。好的,如果您使用mnist,它是28x28=784像素的图片,其中欧几里德函数只查看其中的前两个x[0]和x[1]。因此,您在计算中遗漏了x[2]到x[783]?我尝试了您的解决方案(并修复了您的缩进):到目前为止,
k=2
在大约20分钟内找到了一个错误率。
sklearn
如何具有相同的距离度量,但结果更快?这太慢了(
dist(x, y) = sqrt(dot(x, x) - 2 * dot(x, y) + dot(y, y))