Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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 Sci工具包学习KNN用户定义的距离矩阵:实际值与传递的值不匹配_Python_Pandas_Scikit Learn_Knn_Nearest Neighbor - Fatal编程技术网

Python Sci工具包学习KNN用户定义的距离矩阵:实际值与传递的值不匹配

Python Sci工具包学习KNN用户定义的距离矩阵:实际值与传递的值不匹配,python,pandas,scikit-learn,knn,nearest-neighbor,Python,Pandas,Scikit Learn,Knn,Nearest Neighbor,我正在寻求你对我突然发现的一个问题的建议。我正在使用sci工具包的最近邻方法查找最近邻。为了计算距离,我使用了一个用户定义的距离函数-如下所示: def HVDM(a, b): print("a:", a[0], ",", a[1], ",", a[2], ",", a[3], ",", a[4], ",", a[5], ",", a[6], ",", a[7]) print("b:", b[0], ",", b[1], ",", b[2], ",", b[3], ",", b[

我正在寻求你对我突然发现的一个问题的建议。我正在使用sci工具包的最近邻方法查找最近邻。为了计算距离,我使用了一个用户定义的距离函数-如下所示:

def HVDM(a, b):
    print("a:", a[0], ",", a[1], ",", a[2], ",", a[3], ",", a[4], ",", a[5], ",", a[6], ",", a[7])
    print("b:", b[0], ",", b[1], ",", b[2], ",", b[3], ",", b[4], ",", b[5], ",", b[6], ",", b[7])
    return 0
为了保存数据,我使用了pandas数据帧和numpy数组。我的数据集有八个属性,它们被传递,第一个属性的值只有0、1和2。下面我给出了我的数据集中的一些示例:

[ 0.0 , 0.455 , 0.365 , 0.095 , 0.514 , 0.2245 , 0.10099999999999999 ,0.15] 
[ 0.0 , 0.35 , 0.265 , 0.09 , 0.2255 , 0.0995 , 0.0485 , 0.07 ] 
[ 1.0 , 0.53 , 0.42 , 0.135 , 0.677 , 0.2565 , 0.1415 , 0.21 ] 
[ 0.0 , 0.44 , 0.365 , 0.125 , 0.516 , 0.2155 , 0.114 , 0.155 ] 
[ 2.0 , 0.33 , 0.255 , 0.08 , 0.205 , 0.0895 , 0.0395 , 0.055 ]
问题是,当我试图查看这些值如何传递给距离函数时,我发现了一些不匹配。特别是在第一个传递的参数“a”的情况下,第一个属性明显改变,但对于第二个参数“b”,第一个属性不变。下面我给出了一些通过的示例:

a: [ 0.9554704333253531 , 0.5239920995930099 , 0.407881254488869 , 0.1395163993296614 , 0.82874215944458 , 0.35936748862820106 , 0.18059360785252604 , 0.23883085946851795 ]
b: [ 2.0 , 0.25 , 0.185 , 0.065 , 0.071 , 0.027000000000000003 , 0.0185 , 0.0225 ]
a: [ 0.9554704333253531 , 0.5239920995930099 , 0.407881254488869 , 0.1395163993296614 , 0.82874215944458 , 0.35936748862820106 , 0.18059360785252604 , 0.23883085946851795 ]
b: [ 2.0 , 0.2 , 0.145 , 0.05 , 0.036000000000000004 , 0.0125 , 0.008 , 0.011000000000000001 ]
a: [ 0.9554704333253531 , 0.5239920995930099 , 0.407881254488869 , 0.1395163993296614 , 0.82874215944458 , 0.35936748862820106 , 0.18059360785252604 , 0.23883085946851795 ]
b: [ 1.0 , 0.585 , 0.47 , 0.17 , 1.099 , 0.3975 , 0.2325 , 0.358 ]
谁能给我解释一下,这里到底发生了什么

以下是代码的重要部分:

import numpy as np
import pandas as pd
from sklearn.neighbors import NearestNeighbors

headers = ["sex", "length", "diameter", "height", "whole_weight",
           "shucked_weight", "viscera_weight", "shell_weight", "rings"]

df = pd.read_csv("abalone.data", header=None, names=headers, na_values="?")

replace_lebels = {"sex":     {"M": 0, "F": 1, "I":2}}
df.replace(replace_lebels, inplace=True)

def HVDM(a, b):
    print("a:", a[0], ",", a[1], ",", a[2], ",", a[3], ",", a[4], ",", a[5], ",", a[6], ",", a[7])
    print("b:", b[0], ",", b[1], ",", b[2], ",", b[3], ",", b[4], ",", b[5], ",", b[6], ",", b[7])
    return 0

X = np.array(df.drop(['rings'], 1))
y = np.array(df['rings'])

for item in X:
    print("X:", item[0], ",", item[1], ",", item[2], ",", item[3], ",", item[4], ",", item[5], ",", item[6], ",", item[7])

knn = NearestNeighbors(n_neighbors=6, algorithm='ball_tree', metric='pyfunc', metric_params={"func":HVDM})
knn.fit(X)

我不能完全确定NearestNegihbors ball_树算法的行为。到目前为止,我能够理解的是,算法决定了“a”的值。“b”表示从数据传递的确切值

如果仔细观察,您会发现“a”的值总是相同的。我相信KNN为a设置了相同的值,以获得值“b”的距离。要获得距离KNN,请从一个起点开始,并将所有其他点与该起点进行比较。通过这样做,它确定哪些值更接近


简而言之,您从未设置“a”的值。您给出的是“b”的值。“a”的值由KNN确定,用于获得数据点的相对距离

“你能包括你正在使用的实际代码吗?”尤卡补充道,我的整个代码稍微大一点,所以我避免了这种情况。但如果你愿意,我可以给你git链接。我已经添加了代码的主要部分,不包括无关的细节。输出相同,请检查@Yucabut生成ill sex列的代码在哪里?a[0]或每行@yuca的第一个值