24、25 KNN及实例

本文介绍了K近邻(KNN)算法的原理,包括选择合适的K值、距离计算方法如欧式距离、曼哈顿距离等。通过交叉验证确定K值,并以手写数字识别为例展示KNN的应用。还对比了KNN与其他分类方法如SVM、朴素贝叶斯和决策树的准确率。
摘要由CSDN通过智能技术生成

K近邻原理:
1、计算待分类物体与其他已知物体的距离
2、找出距离最近的K个邻居
3、这K个邻居中,属于哪个分类的最多,则待分类物体属于哪类。

K值的选择
K不能过小,否则可能会因为噪声而产生分类误差,分类过拟合;
K也不能过大,鲁棒性强,但会欠拟合。
K值是工程实践得到的, 。
交叉验证
将样本集中大部分样本作为训练集,剩余的部分做测试集,来验证分类模型的准确性,K值一般选取在较小范围内,并且 准确性最高的那一个。
样本距离计算方式:
1、欧式距离;
2、曼哈顿距离;
3、闵可夫斯基距离;
4、切比雪夫距离;
5、余弦距离。
前三种是KNN常用距离。
1、欧式距离
两点在N维空间欧式距离:
在这里插入图片描述
2、曼哈顿距离

是两点在坐标系上的绝对轴距之和。下图绿色线为欧氏距离,红色和黄色线为曼哈顿距离。
在这里插入图片描述
3、闵可夫斯基距离
是一组距离的定义。
对于 n 维空间中的两个点 x(x1,x2,…,xn) 和 和 y(y1,y2,…,yn) , x 和 y 两点之间的闵闵可夫斯基距离为:
在这里插入图片描述
p是空间维数。p=1 时,就是曼哈顿距离;p=2 时,就是欧氏距离;当 p→∞时,就是切比雪夫距离。
4、切比雪夫距离
max(|x1-y1|,|x2-y2|)
5、余弦距离
计算的是两个向量的夹角,衡量相关性。
KD树
一种二叉树结构,可以提升搜索效率。在sklearn中可以直接调用。
KNN回归
找到K个邻居,将邻居属性的加权平均值作为新点属性预测值。

实例:对手写数字进行识别

#分类
from sklearn.neighbors import KNeighborsClassifier
#回归
from sklearn.neighbors import KNeighborsRegressor

KNN分类器构造函数
KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, algorithm=‘auto’,leaf_size=30)

from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
digits=datasets.load_digits()
print(digits.keys())#查看属性
data=digits.data
print(data.shape)#查看大小
print(digits.images[0])#第一幅图的矩阵
print(digits.target[0])#第一幅图代表的数字
plt.gray()#灰度图像
plt.imshow(digits.images[0])#图像处理
plt.show()#图像显示
train_x,test_x,train_y,test_y=train_test_split(data,digits.target,test_size=0.25,random_state=33)
#规范化
ss=StandardScaler()
train_ss_x=ss.fit_transform(train_x)
test_ss_x=ss.transform(test_x)
#构建knn分类器
knn=KNeighborsClassifier()
knn.fit(train_ss_x,train_y)
prediction=knn.predict(test_ss_x)
print("KNN准确率为:%.4lf"% metrics.accuracy_score(prediction,test_y))

输出:
在这里插入图片描述
在这里插入图片描述
KNN准确率为:0.9756

与其他分类方法作比较:
1、SVM

from sklearn import svm
svm=svm.SVC()
svm.fit(train_ss_x,train_y)
prediction_svm=svm.predict(test_ss_x)
print("SVM分类准确率为:%.4lf"% metrics.accuracy_score(prediction_svm,test_y))

输出:
SVM分类准确率为:0.9867

2、多项式朴素贝叶斯分类
朴素贝叶斯分类定义:
在这里插入图片描述

from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import MinMaxScaler
mm=MinMaxScaler() #多项式朴素贝叶斯传入数据不能为负数
train_mm_x=mm.fit_transform(train_x)
test_mm_x=mm.transform(test_x)
mnb=MultinomialNB()
mnb.fit(train_mm_x,train_y)
prediction_mnb=mnb.predict(test_mm_x)
print("朴素贝叶斯分类准确率为:%.4lf"% metrics.accuracy_score(prediction_mnb,test_y))

输出:
朴素贝叶斯分类准确率为:0.8844

3、决策树分类

from sklearn.tree import DecisionTreeClassifier
dtc=DecisionTreeClassifier()
dtc.fit(train_mm_x,train_y)
prediction_dtc=dtc.predict(test_mm_x)
print("决策树分类准确率为:%.4lf"% metrics.accuracy_score(prediction_dtc,test_y))

决策树分类准确率为:0.8556

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值