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