我想實現一個KNN 1D估計:有超過一個元素的數組的Pyplot真值是不確定
# 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()
會拋出:
File "x", line 55, in nearest_n
if np.abs(x-n) < np.abs(x-nnb[nb]):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我知道錯誤來自數組輸入在plot()中,但我不知道如何在運算符中避免這種情況>/==/<
'data'來自包含浮點數的1D txt文件。
我嘗試使用矢量化:
nearest_n = np.vectorize(nearest_n)
導致:
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
nearest_n(1.5)應該然後導致
nbb=[1.2,1.7]
v = 0.5
並返回2 /(6 * 0.5)= 2/3
該函數運行例如neares_n(2.0,4,數據),並給出0.0741586011463
你能否包括預期的輸出(如果你必須手工完成,你可能需要使用較小的輸入) 。 :) – MSeifert
輸出將是3個不同的概率密度圖(k = 2,8,35),s.th.來自數組[-4,8]的每個值將映射到概率[0,1] –
不,我的意思是調用'nearest_n'的字面結果。例如,'nearest_n(np.arange(-4.0,8.0,0.1),2,np.array([1,2,3]))''應該返回什麼?我已經或多或少地選擇了這些值,如果需要的話插入更合適的值(如果沒有參考實現,則更容易手動計算)。 – MSeifert