我在matlab中应用了KNN算法来分类手写数字。数字最初为矢量格式8 * 8,并拉伸形成矢量1 * 64。所以每次我比较第一个数字和所有其余数据集(这是相当巨大的),然后第二个数字与其余的设置等等等。现在我的问题是,不是一个邻居是最好的选择总是?由于我正在使用欧几里德距离,(我选择更接近的距离)为什么我还要选择2或3个邻居,因为我得到了最接近的数字?
由于
答案 0 :(得分:1)
你必须考虑噪音。假设你的一些分类例子可能被错误地分类,或者其中一个例子与其他例子非常接近 - 这些例子不同,但它实际上只是一个“小故障”。在这些情况下 - 根据轨道示例对此进行分类可能会导致错误。
根据个人经验,通常为k = 3/5/7实现了最佳效果,但它取决于实例。
如果您希望获得最佳效果,则应使用cross validation为您的特定实例选择最佳k
。
此外,对于KNN,通常只使用奇数作为k
,以避免“绘制”
答案 1 :(得分: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)))