KNN算法介绍
什么是KNN算法
KNN算法,即k-nearlist neighbors,通过寻找K个距离最近的数据,来确定当前数据的大小或者类别
KNN算法分类与回归
KNN分类算法:对于一个待分类的样本,在数据集中找到与它相距最近的K个数据样本,然后根据这K个样本所属类别判断,数量最多的即为待分类样本的预测类别
KNN回归算法:对于一个待预测样本,在数据集中找到与它相距最近的K个数据样本,然后取这K个样本的平均值,得到待预测样本的预测结果
距离公式
1、欧式距离:
二维空间:a点为(x1,y1),b点为(x2,y2)
三维空间:a点为(x1,y1 ,z1),b点为(x2,y2 ,z2)
n维空间:a点为(x11,x12 ,…,x1n),b点为(x21,x22,…,x2n)
2、曼哈顿距离:
二维空间:a点为(x1,y1),b点为(x2,y2)
n维空间:a点为(x11,x12 ,…,x1n),b点为(x21,x22,…,x2n)
KNN算法—优缺点
优点:
1.简单,易于理解,易于实现,无需训练;
2.适合对稀有事件进行分类;
3.对异常值不敏感。
缺点︰
1.样本容量比较大时,计算时间很长;
⒉.不均衡样本效果较差。
sklearn库
什么是sklearn库
Sklearn (Scikit-Learn) 是基于 Python 语言的第三方机器学习库。它建立在 NumPy, SciPy, Pandas 和 Matplotlib库 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。
sklearn的安装
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/
sklearn的使用
使用sklearn官网API:https://scikit-learn.org/ knn算法的介绍 搜索k-nearest neighbors,注意版本1.0和1.2问题
sklearn中KNN算法的案例实现
下面我们通过一个具体的例子来了解KNN算法:
现已存在一个数据文件datingTestSet2.txt ,为历年大学生的调查问卷表
第1列:每年旅行的路程
第2列:玩游戏所有时间百分比
第3列:每个礼拜消耗零食的重量
第4列:学生所属的类别,1表示爱学习,2表示一般般,3表示爱玩。
通过该数据预测大一新生的所属类别
以下是datingTestSet2.txt中的文件
对以上数据进行分类并得出结果
# 导入必要的库
import matplotlib.pyplot as plt # 用于绘图
import numpy as np # 用于数值计算和数组操作
# 加载数据
# 使用numpy的loadtxt函数从文件'datingTestSet2.txt'中加载数据
# 假设文件中的数据是以空格或制表符分隔的,每行是一个样本,最后一列是目标变量(标签),其余列是特征
data = np.loadtxt('datingTestSet2.txt')
# 按类别划分数据
# 根据最后一列(目标变量)的值将数据划分为三类
data_1 = data[data[:, -1] == 1] # 筛选出标签为1的所有样本
a = data[:, -1] # 获取所有样本的标签列(最后一列)
b = [data[:, -1] == 1] # 创建一个布尔列表,表示哪些样本的标签为1(这行代码似乎没有实际用途)
data_2 = data[data[:, -1] == 2] # 筛选出标签为2的所有样本
data_3 = data[data[:, -1] == 3] # 筛选出标签为3的所有样本
# 创建三维图形
fig = plt.figure() # 创建一个新的图形
ax = plt.axes(projection='3d') # 创建一个三维坐标系
# 绘制散点图
# 使用不同的颜色和标记绘制不同类别的样本
ax.scatter(data_1[:, 0], data_1[:, 1], data_1[:, 2], c="#FF0000", marker="o") # 绘制标签为1的样本,红色圆形
ax.scatter(data_2[:, 0], data_2[:, 1], data_2[:, 2], c="#33FFFF", marker="^") # 绘制标签为2的样本,青色三角形
ax.scatter(data_3[:, 0], data_3[:, 1], data_3[:, 2], c="#000011", marker="+") # 绘制标签为3的样本,深蓝色加号
# 设置坐标轴标签
ax.set(xlabel="Xzhou", ylabel="Yzhou", zlabel="Zzhou") # 设置X、Y、Z轴的标签
# 显示图形
plt.show() # 弹出窗口显示绘制的三维散点图
结果如下
模型训练
# 导入必要的库
import numpy as np # 用于数值计算和数组操作
from sklearn.neighbors import KNeighborsRegressor # 导入KNN回归模型
# 加载数据
# 使用numpy的loadtxt函数从文件'datingTestSet2.txt'中加载数据
data = np.loadtxt('datingTestSet2.txt')
# 划分特征和目标变量
# data[:, :-1] 表示选取所有行,以及除最后一列之外的所有列,作为特征矩阵X
# data[:, -1] 表示选取所有行,以及最后一列,作为目标变量y
X = data[:, :-1] # 特征矩阵
y = data[:, -1] # 目标变量
# 初始化KNN回归模型
# 创建一个KNeighborsRegressor对象,设置n_neighbors=10,即使用10个最近邻居进行回归
neigh = KNeighborsRegressor(n_neighbors=10)
# 训练模型
# 使用特征矩阵X和目标变量y来训练KNN回归模型
neigh.fit(X, y)
模型预测
# 预测单个样本
# 对输入样本 [36429, 3.570968, 0.832254] 进行预测
# 注意:输入样本需要是一个二维数组(即使只有一个样本),因为predict方法接受二维数组作为输入
print(neigh.predict([[36429, 3.570968, 0.832254]]))
# 定义多个待预测的样本
# predict_data 是一个包含多个样本的列表,每个样本是一个包含特征值的列表
predict_data = [
[9744, 11.440364, 0.760461], # 样本1
[16191, 0.100000, 0.605619], # 样本2
[42377, 6.519522, 1.058602], # 样本3
[27353, 11.475155, 1.528626] # 样本4
]
# 预测多个样本
# 使用训练好的KNN回归模型对predict_data中的多个样本进行预测
# 输出结果是一个包含每个样本预测值的数组
print(neigh.predict(predict_data))
通过以上模型预测最终得出结果
[2.]
[2.1 2. 2. 2.6]
以上就是sklearn中KNN算法的案例实现。