【问题标题】:What do mean income values in custom metric for K nearest neighbors?K 最近邻的自定义指标中的收入值是什么意思?
【发布时间】:2017-03-05 11:05:58
【问题描述】:

我需要使用具有自定义指标的 K 最近邻。我有一个适用于我的对象属性的公式。这意味着我有矩阵。该矩阵由向量组成,每个向量包含公式中使用的 3 个标量值。

我找到了如何在库 sklearn 的 KNeighborsClassifier 类中使用自定义指标。它只需要一个名为 metric 的参数,该参数可以是字符串或可调用的。所以......我已经创建了函数,但是这个函数第一次需要两个相同的数组包含 10 个标量值。我的意思是每个数组都包含 10 个值而不是 3 个。在随后的每次函数中,该函数都从我的矩阵中获取值。

我查看了调用堆栈,并且看到了从类BallTree 调用的函数。我已经阅读过这种结构,但我无法理解它如何转换我的数据或它在第一次传递给我的指标的方式。

前两个相同的数组是什么意思?

我通过这段代码实例化分类器

clf = KNeighborsClassifier(n_jobs=4, metric=custom_metric)
clf.fit(X, Y)

X 包含这样的值。

array([[2.400154, 0.07744107744107744, 96.80566400000001],
       [2.39325, 0.07744107744107744, 97.219544],
       [2.395162, 0.07744107744107744, 97.10519599999999],
       [3.101635, 0.009788768675940238, 65.88368],
       [3.09882, 0.009788768675940238, 65.97364499999999],
       [3.099576, 0.009788768675940238, 65.956018]], dtype=object)

custom_metric 是我的功能。它现在什么都没有。

def custom_metric(x: np.ndarray, y: np.ndarray) -> float:
    pass

xy 的示例

array([ 0.02274535,  0.21161613,  0.41314247,  0.39046054,  0.1670481 ,
        0.15515555,  0.13329802,  0.59103014,  0.26246693,  0.7727967 ])

正如我在上面写的那样,它们是相同的。

对不起,如果我的英语不清楚。

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    您提供的 sn-p 没有多大意义,knn 指标永远不会从与您训练它的空间不同的空间中获得一些东西作为参数,展示它的最小示例:

    import numpy as np 
    x = np.array(range(10)).reshape(5,-1)
    y = np.array(range(5))
    
    from sklearn.neighbors import KNeighborsClassifier as KNN
    def foo(X, Y):
       print 'X', X, X.shape
       print 'Y', Y, Y.shape
       return 0
    
    clf = KNN(metric=foo)
    clf.fit(x, y)
    clf.predict(x)
    

    按预期打印

    X [ 0.  1.] (2,)
    Y [ 2.  3.] (2,)
    X [ 0.  1.] (2,)
    Y [ 4.  5.] (2,)
    X [ 0.  1.] (2,)
    Y [ 6.  7.] (2,)
    X [ 0.  1.] (2,)
    Y [ 8.  9.] (2,)
    X [ 2.  3.] (2,)
    Y [ 4.  5.] (2,)
    X [ 2.  3.] (2,)
    Y [ 6.  7.] (2,)
    X [ 2.  3.] (2,)
    Y [ 8.  9.] (2,)
    X [ 4.  5.] (2,)
    Y [ 6.  7.] (2,)
    X [ 4.  5.] (2,)
    Y [ 8.  9.] (2,)
    X [ 6.  7.] (2,)
    Y [ 8.  9.] (2,)
    X [ 0.  1.] (2,)
    Y [ 0.  1.] (2,)
    X [ 2.  3.] (2,)
    Y [ 2.  3.] (2,)
    X [ 4.  5.] (2,)
    Y [ 4.  5.] (2,)
    X [ 6.  7.] (2,)
    Y [ 6.  7.] (2,)
    X [ 8.  9.] (2,)
    Y [ 8.  9.] (2,)
    

    因此,在您的情况下,矩阵应该接受 2 个向量,每个 3 维,并返回它们之间的有效距离,仅此而已。

    如果你传递给predict,你只能得到 10 个维度的东西。 BallTree 中没有隐藏任何“神奇”的东西,它必须在您的数据中。

    【讨论】:

    • 您好!你能告诉我你的 sklearn、numpy、scipy 的版本吗?
    • 哦!你有python 2吗?我在 python 3 上。我已经测试了你的代码,它会输出你显示的内容,但是在 python 3 上,我有一个关于度量函数返回值的错误。 Metric 必须返回浮点值,表示对象之间的距离。
    • 最后加return 0即可。什么都不会改变
    • 我已经完成了,但是我在 Python 3 上遇到了我的问题。在 Python 2 上一切都很好。无论如何,我可以做解决方法。这个数组是相等的,所以我可以第一次返回 0 。我应该将您的答案标记为解决方案吗?
    猜你喜欢
    • 2020-03-22
    • 2019-11-01
    • 2012-07-19
    • 2022-01-01
    • 2011-11-05
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多