1.KNN算法

1.1 核心思想

KNN(K-Nearest Neighbors)即K近邻算法,是无训练、惰性学习的经典分类算法。核心逻辑:物以类聚。

对未知样本,计算其与所有训练样本的距离,选取距离最近的 K 个样本,通过少数服从多数投票机制,确定未知样本的分类结果。

1.2 核心要素

K值:超参数,K过小易过拟合,K过大易欠拟合

距离度量:默认欧式距离,适用于连续数值特征

投票规则:近邻样本多数标签即为预测结果子

1.3

案列一:大学分宿舍

import numpy as np
from sklearn.neighbors import KNeighborsClassifier

data = np.loadtxt('datingTestSet2.txt')
X= data[:,:-1]
y= data[:,-1]
neigh=KNeighborsClassifier(n_neighbors=40)
neigh.fit(X,y)

print(neigh.predict([[37708,2.091551,0.833920]]))


predict_data=[[52914,3.977796,1.043109],
[16801,10.585227,1.455708],
[11533,1.271946,0.796506],
[16721,0.000000,0.242778],
[5832,1.000000,0.089749],
[44591,11.521298,0.300860],
[10143,1.139447,0.415383],
[21609,6.699090,1.391892],
[32817,2.449378,1.322560],
[15640,0.100000,1.228380]]
print("再次多人预测:")
print(neigh.predict(predict_data))

输出:

​[3.]
再次多人预测:
[1. 2. 2. 2. 2. 3. 2. 3. 3. 2.]

​
案例二:辨别鸢尾花
import pandas as pd
#读取数据
train_data =pd.read_excel("鸢尾花训练数据.xlsx")
test_data=pd.read_excel("鸢尾花测试数据.xlsx")

#训练数据
train_X=train_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
train_y=train_data['类型_num']

#将数据标准化
from sklearn.preprocessing import scale

data =pd.DataFrame() #空表格数据对象
data['萼片长标准化']=scale(train_X['萼片长(cm)'])
data['萼片宽标准化']=scale(train_X['萼片宽(cm)'])
data['花瓣长标准化']=scale(train_X['花瓣长(cm)'])
data['花瓣宽标准化']=scale(train_X['花瓣宽(cm)'])

#使用sklearn库中的KNN模块
from sklearn.neighbors import KNeighborsClassifier
#
knn = KNeighborsClassifier(n_neighbors=2)
knn.fit(data,train_y)
#
train_predicted =knn.predict(data) #自测预测
score=knn.score(data,train_y)
print(score)

#使用测试数据测试
test_X=test_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
test_y=test_data['类型_num']
#
from sklearn.preprocessing import scale
#
data_test=pd.DataFrame() #建立新的空表格
data_test['萼片长标准化']=scale(test_X['萼片长(cm)'])
data_test['萼片宽标准化']=scale(test_X['萼片宽(cm)'])
data_test['花瓣长标准化']=scale(test_X['花瓣长(cm)'])
data_test['花瓣宽标准化']=scale(test_X['花瓣宽(cm)'])
#
test_predicted =knn.predict(data_test)
score=knn.score(data_test,test_y)
#
print(score)

输出:

0.9696969696969697
0.8888888888888888

进程已结束,退出代码0

1.4KNN的优缺点

优点:

  • 原理简单、通俗易懂,无复杂迭代训练

  • 无参数训练、对异常值不敏感,小数据集效果优秀

  • 多分类、二分类场景均适用,通用性强

缺点:

  • 预测速度慢:惰性学习,每次预测都要遍历全部样本

  • 对高维数据、非标准化数据极其不友好

  • K值需要人工调优,无固定最优值

更多推荐