Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.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 包含多个元素的数组的Pyplot真值不明确_Python_Matplotlib_Knn_Density Plot - Fatal编程技术网

Python 包含多个元素的数组的Pyplot真值不明确

Python 包含多个元素的数组的Pyplot真值不明确,python,matplotlib,knn,density-plot,Python,Matplotlib,Knn,Density Plot,我正在尝试实施knn 1D估算: # nearest neighbors estimate def nearest_n(x, k, data): # Order dataset #data = np.sort(data, kind='mergesort') nnb = [] # iterate over all data and get k nearest neighbours around x for n in data: if nnb.

我正在尝试实施knn 1D估算:

# nearest neighbors estimate
def nearest_n(x, k, data):
    # Order dataset
    #data = np.sort(data, kind='mergesort')
    nnb = []
    # iterate over all data and get k nearest neighbours around x
    for n in data:
        if nnb.__len__()<k:
            nnb.append(n)
        else:
            for nb in np.arange(0,k):
                if np.abs(x-n) < np.abs(x-nnb[nb]):
                    nnb[nb] = n
                    break

    nnb = np.array(nnb)
    # get volume(distance) v of k nearest neighbours around x
    v = nnb.max() - nnb.min()
    v = k/(data.__len__()*v)

    return v

interval = np.arange(-4.0, 8.0, 0.1)
plt.figure()
for k in (2,8,35):
    plt.plot(interval, nearest_n(interval, k,train_data), label=str(o))
plt.legend()
plt.show()
其结果是:

line 50, in nearest_n
    for n in data:
TypeError: 'numpy.float64' object is not iterable
下面是一个例子,假设:

data = [0.5,1.7,2.3,1.2,0.2,2.2]
k = 2
最近的_n(1.5)应导致

nbb=[1.2,1.7]
v = 0.5 
并返回2/(6*0.5)=2/3


例如,该函数在neares_n(2.0,4,data)附近运行,并给出0.0741586011463

作为
x
传递的np.arange(-4,8,01),这是一个值数组。因此
x-n
是一个与
x
长度相同的数组,在本例中为120个元素,因为数组和标量的减法是按元素进行减法的。与
nnb[nb]
相同。因此,比较的结果是一个长度为120的数组,其布尔值取决于
np.abs(x-n)
的每个元素是否小于
np.abs(x-nnb[nb])
。这不能直接用作条件,您需要将这些值合并为一个布尔值(使用
all()
any()
,或者只是重新思考代码)


工作正常。我原以为pyplot.plot会为我做这件事,但我想它不会…

你能包括预期的输出吗(如果你必须手动完成,你可能希望使用较小的输入)。:)输出将是3个不同的概率密度图(k=2,8,35),s.th。数组[-4,8]中的每个值都将映射到概率[0,1]否,我指的是调用
最近值的文字结果。例如,
最近的数组(np.arange(-4.0,8.0,0.1),2,np.array([1,2,3])应该返回什么?我或多或少地随机选择了这些值,如果需要的话插入更合适的值(或者如果没有参考实现的话更容易手工计算)。好的,就这么做:)这不是
pyplot
的问题,我不确定你为什么会这么想?。您编写了
nearest\u n
以获取
x
参数的标量,因此在不重写代码的情况下无法传入向量。在这里,你每次循环通过一个向量,并将一个标量传递到你的函数中。我以为pyplot会像这样处理向量输入,但我错了。我只是想澄清一下,因为我不确定你是否理解问题的根源。该错误不是在
plt.plot
函数中抛出的,也不是因为您对
pyplot
的输入,该错误是在
nearest\n
中抛出的,是由于传递给该函数的参数引起的。@spruceb您可以很肯定OP没有理解该问题,另请参见,在他问这个问题之前有两个答案。
data = [0.5,1.7,2.3,1.2,0.2,2.2]
k = 2
nbb=[1.2,1.7]
v = 0.5 
plt.figure()
X = np.arange(-4.0,8.0,0.1)
for k in [2,8,35]:
    Y = []
    for n in X:
        Y.append(nearest_n(n,k,train_data))
    plt.plot(X,Y,label=str(k))
plt.show()