机器学习1:KNN算法
·
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值需要人工调优,无固定最优值
更多推荐

所有评论(0)