admin管理员组

文章数量:1794759

KNN(K近邻算法)

KNN(K近邻算法)

一 算法原理

通过距离判断两个样本是否相似,使用与未知样本最近的k个样本(近邻)的学日文类别来分类。数量最多的标签类别就是新样本的标签类别。

1)实现过程

XTrain为训练集,X_Test为测试集

遍历训练集中所有样本,计算训练集样本与待标记样本的距离Distance对Distance进行排序,取最近的k个点的类别 X_KNN统计 X_Knn 中每个类别的个数,待标记样本的类别则是X_Knn中个数最多的类别

2)如何计算距离?

欧式距离:

二 算法优缺点

算法参数是k,k可以理解为k个邻居的类别

k值越大,模型的偏差越大,对噪声不敏感。k很大时,模型会j减肥药欠拟合。当k为训练样本个数时,单纯取训练样本中个数最多的分类作为所有未知样本的分类。k值越小,模型的方差越大,受噪声影响大,容易过拟合。三 Sklearn实现from sklearn.neighbors import KNeighbors化学键理论Classifierfrom sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_splitimport pandas as pdimport numpy as npdata = load_breast_cancer()X = data.dataY = data.targetXtrain,Xtest,Ytrain,Ytest = train_test_split(X,Y,test_size=0.3,random_state=666)model = KNeighborsClassifier(n_neighbors=3)model = model.fit(Xtrain,Ytrain)四 选择最优K值(n_neighbors)

由于数据需要切分为训练集和测试集,不同的切割方式会有不同的最优k值。所以,使用k折交叉验证的方法来将训练集再切分为训练集和验证集,来确定不同不同切割方式下,哪个k值表现最好。

交叉验证+学习曲线

from sklearn.model_selec万用表怎么测电压tion import cross_val_scorescore = []var = []krange=range(1,20)for i in kloreenrange: model = KNeighborsClassifier(n_neighbors=i)垄断竞争市场 cvsesult = CVS(model,Xtrain,Ytrain,cv=5) score.appendblmanhua(cvsesult.mean()) var.append(cvsesult.var())plt.plot(krange,score,color='私密;k')plt.plot(krange,np.array(score)+np.array(var)*2,c='red',linestyle='--')plt.plot(krange,np.array(score)什么是早恋凉拌洋白菜-np.array(var)*2,c='red',linestyle='--')

K折交叉验射线防护门证

如果使用交叉验证效果不好,考虑标签是由顺序的;或是数据量太小,折数太高。折数太大,会导致运算效率慢,预测率方差大。一般折数取5或10五 归一化

由于knn算法需要计算未知样本与训练样本之间的距离,所以某些数值引入css大的特征会距离产生显著影响,即“量纲不统一”。可通过“归一化”来消除量纲的影响。

先划分训练数据和测试数据,再归一化。否则测试数据会包含训练数据的信(最大值和最小值)

from sklearn.preprocessing import MinMaxScaler as mmsXtrain,Xtestwin7升win10,Ytrain,Ytest=train_test_split(X,y,test_size=0.2,random_state=420)#归一化MMS_01=mms().fit(Xtrain) MMS_02=mms().fit(Xtest)X_train=MMS_01.t高考纪录片ransform(Xtrain) X_test =MMS_02.transform(Xtest)score=[]var=[]for i in range(1,20): clf=KNeighborsClassifier(n_neighbors=i) cvresult=CVS(clf,X_train漱口水,Ytrain,cv=5) score清明节禁忌.append(cvresult.mean()) var.append(cvresult.var()) plt.plot(西安杀人案krange,score,color="k")plt.plot(krange,np.array(score)+np.array(var)*2,c="red",linestyle="--")plt.plot(krange,np.array(score)-np.array(var)*2,c="red",linestyle="--")plt.show()score.index(max(score))+1 # 8六 距离的惩罚

原始的KNN算法对最近的k的邻居都有相同的投票权重。但实际上距离有远近之分,距离近的权重要大一些,距离远的权重要小一些。所以sklearn中通过weights参数来调节。

for i in range(1,20): clf=KNeighborsClassifier(n_neighbors=i,weights='dista王子文资料nce') 大友梨奈 cvresult=CVS(clf,X_train,Ytrain,cv=5) score.append(cvresult.mean()) var.append(cvresult.var())plt.plot(krange,score,color="k")plt.plot(krange,np.array(score)+np.array(var)*2,c="red",linestyle="--")plt.plot(krange,np.array(score)-np.array(var)*2,c="red",linestyle="--")plt.show()clf=KNeighborsClassifier(n_neighbors=6,weights='distance'灾难电影推荐).fit(X_train,Ytrain)score=clf.score(X_test,Ytest)score # 0.947368

本文标签: 近邻算法KNN