一、KNN算法
K-近邻算法(K-Nearest Neighbors,简称KNN),根据K个邻居样本的类别来判断当前样本的类别;如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别。
一些距离:
距离类型 | 核心特点 | 典型应用场景 |
---|---|---|
欧式距离 | 直线距离,直观但受尺度影响 | 图像识别、聚类分析(需先标准化) |
曼哈顿距离 | 网格距离,计算快,抗异常值 | 路径规划、高维数据分类 |
切比雪夫距离 | 最大维度差异,关注极端值 | 质量检测、棋盘类问题 |
余弦距离 | 方向相似度,忽略长度 | 文本分类、推荐系统(如用户兴趣匹配) |
马氏距离 | 考虑协方差,消除相关性和尺度 | 异常检测、金融风险评估 |
import joblib#用来保存模型
from sklearn.datasets import load_wine#加载红酒数据集
from sklearn.model_selection import train_test_split#引入数据集划分
from sklearn.neighbors import KNeighborsClassifier#KNN算法模型
from sklearn.preprocessing import StandScaler#标准化
import numpy as np
#加载数据集
x,y = load_wine(return_X_y=True)
x_train,x_test,y_train,_y_test = train_test_split(x,y,test_size=0.2,random.state=42)
#特征工程化——标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
#fit(x_train) 会计算训练集的均值和标准差
# transform(x_train) 会用训练集的均值和标准差对训练数据标准化
# transform(x_test) 同样用训练集的均值和标准差对测试数据标准化
#训练
model = KNeighborsClassifier(n_neighbors=7)#查询的近邻数为7
model.fit(x_train,x_test)
#预测
y_p = model.predict(x_test)
print(model.score(x_test,y_test))#计算准确率
#模型保存
joblib.dump(model,'../src/model/KNN.pkl')
joblib.dump(transfer,'../src/model/transfer.pkl')
我们用红酒的数据集训练好模型后并保存,可在其他地方引用这个模型来进行测试
import joblib
model = joblib.load('../src/model/KNN.pkl')
transfer = joblib.load('../src/model/transfer.pkl')
x_new = [[5.1,3.5,1.4,0.2,1,2,3,4,5,6,7,8,9],
[5.9,3.0,5.1,1.8,2,3,4,5,6,7,8,9,10],
]
x_new = transfer.transform(x_new)
y_predict = model.predict(x_new)
二、KNN算法的缺点:
1、对于大规模数据集,计算量大,因为需要计算测试样本与所有训练样本的距离
2、对于高维数据,距离度量可能变得不那么有意义,数值很大相差不大。
3、需要选择合适的k值和距离度量,这可能需要一些实验和调整
三、API
class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto')
参数:
(1)n_neighbors:
int, default=5, 默认情况下用于kneighbors查询的近邻数,就是K
(2)algorithm:
{‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’。找到近邻的方式,注意不是计算距离 的方式,与机器学习算法没有什么关系,开发中请使用默认值'auto'
方法:
(1) fit(x, y)
使用X作为训练数据和y作为目标数据
(2) predict(X) 预测提供的数据,得到预测数据