2

我在matlab中应用了KNN算法对手写数字进行分类。数字最初是 8*8 的矢量格式,然后拉伸形成一个 1*64 的矢量。因此,每次我将第一个数字与所有其余数据集(非常大)进行比较时,然后将第二个数字与其余数据集等等等等等等。现在我的问题是,不是 1 个邻居是最佳选择吗总是?由于我使用的是欧几里得距离,(我选择更接近的那个)为什么我还要选择 2 或 3 个以上的邻居,因为我得到了最接近的数字?

谢谢

4

2 回答 2

1

你必须考虑噪音。假设您的某些分类示例可能被错误分类,或者其中一个奇怪地与其他示例非常接近 - 它们不同,但实际上只是一个“故障”。在这些情况下——根据这个偏离轨道的例子进行分类可能会导致错误。

根据个人经验,通常在 k=3/5/7 时获得最好的结果,但这取决于实例。

如果您想获得最佳性能 - 您应该使用交叉验证topk为您的特定实例选择最佳。

此外,对于 KNN,通常只使用奇数k,以避免“平局”

于 2012-04-16T13:29:15.063 回答
0

一个演示 ML Knn 算法的简单程序

Knn 算法通过使用一组数据训练计算机并传递输入以获得预期输出来工作。例如:-考虑一个父母想要训练他的孩子识别“兔子”的照片,这里父母将展示 n 张兔子的照片,如果照片属于兔子,那么我们喊兔子,否则我们将继续前进,就像这样这种方法通过输入一组数据来对计算机进行监督以获得预期的输出

from sklearn.neigbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
df=pd.read_csv("D:\\heart.csv")
new_data{"data":np.array(df[["age","gende","cp","trestbps","chol","fbs","restecg","thalach","exang","oldpeak","slope","ca","thal"]],ndmin=2),"target":np.array(df["target"]),"target_names":np.array(["No_problem","Problem"])}
X_train,X_test,Y_train,Y_test=train_test_split(new_data["data"],new_data["target"],random_state=0)
kn=KNeighborsClassifier(n_neighbors=3)
kn.fit(X_train,Y_train)
x_new=np.array([[71,0,0,112,149,0,1,125,0,1.6,1,0,2]])
res=kn.predict(x_new)
print("The predicted k value is : {}\n".format(res))
print("The predicted names is : {}\n".format(new_data["target_names"][res])
print("Score is : {:.2f}".format(kn.score(X_train,Y_train)))
于 2019-10-27T03:10:13.993 回答