【发布时间】:2021-12-20 21:05:03
【问题描述】:
我正在尝试从头开始创建一个 KNN 函数,然后将其与 scikit-learn KNeighborsClassifier 进行比较。我正在使用 iris 数据集进行测试。
根据我学到的知识,我必须单独获取每个数据点,然后计算它与其余训练数据之间的距离。
最后一步是将它与最接近它的数据的目标值相关联。出于某种原因,当我这样做时,我得到了 4% 的错误率。为什么会这样?
from sklearn import *
import numpy as np
iris = datasets.load_iris()
X = iris.data
Y = iris.target
def PPV(data, target):
target_res = []
true = 0
for i in range(len(target)):
data_copy = data
target_copy = target
training_data = np.delete(data_copy, i, 0)
training_target = np.delete(target_copy, i, 0)
target_res.append(training_target[np.argmin(metrics.pairwise.euclidean_distances([data[i]], training_data))])
# print(f"{i} has target prediction {training_target[np.argmin(metrics.pairwise.euclidean_distances([data[i]], training_data))]}")
for i in range(len(target)):
if target[i] == target_res[i]:
true = true + 1
print(f"The predicted PPV target values are: {target_res}")
print(f"PPV precision: {true*100/len(target)}%")
PPV(X, Y)
上面代码的输出是:
The predicted PPV target values are: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
PPV precision: 96.0%
KNeighbors precision: 100.0% = 1
除非我遗漏了什么,否则我应该能够获得与 K=1 的 KNeighborsClassifier 算法相同的结果,因为它们具有相同的原理。
【问题讨论】:
标签: python numpy scikit-learn knn