1. K 近邻算法(KNN)概述
- 核心定义:K 近邻算法(KNN) 指每个样本可由最接近的 K 个邻近值代表,K 为近邻数量,一般不大于 20。
- 核心逻辑:对于无标签的新数据,通过比较其特征与样本集中数据的特征,提取最相似的 K 个数据的类别标签,以 K 个数据中出现次数最多的类别作为新数据的分类。
2. KNN 算法分类步骤
- 计算已知类别数据集所有点与当前点之间的距离;
- 按照距离递增次序对这些点进行排序;
- 选取与当前点距离最小的 K 个点;
- 确定这 K 个点所在类别的出现频率;
- 返回这 K 个点中出现频率最高的类别,作为当前点的预测分类。
3. 距离度量方式
距离类型 | 定义 | 公式 |
---|---|---|
欧式距离 | 衡量多维空间中两个点之间的绝对距离,是最常见的距离度量 | 二维:d=(x1−x2)2+(y1−y2)2;三维:d=(x1−x2)2+(y1−y2)2+(z1−z2)2;n 维:d=∑i=1n(xi−yi)2 |
曼哈顿距离 | 由赫尔曼・闵可夫斯基提出,指两个点在标准坐标系上的绝对轴距总和 | 平面上:d(i,j)=∣x1−x2∣+∣y1−y2∣ |
4. 应用案例
(1)电影分类
- 已知数据:
电影类型 电影名称 打斗镜头数 接吻镜头数 爱情片 California Man 3 104 爱情片 He's Not Really into Dudes 2 100 爱情片 Beautiful Woman 1 81 动作片 Kevin Longblade 101 5 动作片 Robo Slayer 3000 99 2 动作片 Amped II 18 90 (未知类型) - 任务:根据打斗镜头和接吻镜头数,用 KNN 预测未知电影 Amped II 的类型。
(2)鸢尾花分类
- 特征说明:包含 4 个特征,分别是花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)、花瓣宽度(petal width)(单位:cm)。
- 数据集信息:通过
datasets.load_iris()
加载,包含分类标签(iris.target
)、特征名称(iris.feature_names
)、类别名称(iris.target_names
)。 - 实现步骤:
- 划分训练集和测试集:
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3)
- 训练模型:创建 KNN 实例(
knn = KNeighborsClassifier(n_neighbors=5, metric="euclidean")
),并拟合训练集(knn.fit(x_train, y_train)
) - 评分与预测:计算训练集得分(
train_score = knn.score(x_train, y_train)
)、测试集得分(test_score = knn.score(x_test, y_test)
),预测测试集标签(y_pred = knn.predict(x_test)
)
- 划分训练集和测试集: