一.了解K-邻近算法
1.算法概述
k 近邻法
(k-nearest neighbor, k-NN
) 是一种基本分类与回归方法。是数据挖掘技术中原理最简单的算法之一,核心功能是解决有监督的分类问题。KNN能够快速高效地解决建立在特殊数据集上的预测分类问题,但其不产生模型,因此算法准确 性并不具备强可推广性。
k近邻法
的输入为实例的特征向量,对应与特征空间的点;输出为实例的类别,可以取多类。
k近邻法
三个基本要素:k
值的选择、距离度量及分类决策规则。
2.算法思想
K-最近邻(K-Nearest Neighbor,简称 KNN)算法是一种基本的分类及回归方法。它的思想很简单,即对于一个新的待分类样本,找到与其距离最近的 K 个训练集中的样本,然后根据这 K 个样本的类别进行决策。具体而言,KNN 算法的步骤如下:
- 计算测试样本与每个训练样本之间的距离;
- 对距离进行排序,选择距离最近的 K 个训练样本;
- 根据这 K 个样本的标签进行决策,即将测试样本分为 K 个样本中出现次数最多的类别。
需要注意的是,在 KNN 算法中,距离的计算方式可以采用多种方法,例如欧氏距离、曼哈顿距离等。(在下面的例子中我们使用欧式距离)
一个实例的最近邻是根据标准欧氏距离定义的。更精确地讲,把任意的实例x表示为下面的特征向量:
其中ar(x)表示实例x的第r个属性值。那么两个实例xi和xj间的距离定义为d(xi,xj),其中:
二.实现Knn算法
我打算建立一个电影喜爱分类模型,可以根据你观看时长判断是否属于你喜爱的电影
1.数据集
那么我们先整理一份数据集:
2.代码展示
import numpy as np
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
class KNN:
def __init__(self, k=3):
self.k = k
def fit(self, X, y):
self.X_train = X
self.y_train = y
def predict(self, X):
y_pred = [self._predict(x) for x in X]
return np.array(y_pred)
def _predict(self, x):
distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
k_indices = np.argsort(distances)[:self.k]
k_nearest_labels = [self.y_train[i] for i in k_indices]
most_common = np.argmax(np.bincount(k_nearest_labels))
return most_common
# 创建示例数据集
X_train = np.array([[90], [120], [100], [80], [60]])
y_train = np.array([1, 0, 1, 1, 0])
# 创建并训练 KNN 模型
knn = KNN(k=3)
knn.fit(X_train, y_train)
# 测试数据集
X_test = np.array([[110], [70]])
# 对测试数据进行预测
y_pred = knn.predict(X_test)
# 打印预测结果
for i in range(len(X_test)):
print("观看时长:", X_test[i], " 预测喜好:", "喜欢" if y_pred[i] == 1 else "不喜欢")
3.代码分析
-
euclidean_distance
函数:该函数用于计算两个样本之间的欧氏距离。它接受两个样本向量x1
和x2
,利用 NumPy 的函数进行计算并返回距离值。 -
KNN
类:该类封装了 KNN 算法的相关操作。-
__init__
方法初始化 KNN 对象,并接收一个参数k
,表示选择最近邻居的数量,默认为 3。 -
fit
方法将训练数据集的特征矩阵X
和标签数组y
存储起来,以备后续预测使用。 -
predict
方法用于对测试数据进行预测。它接收一个特征矩阵X
,然后遍历每个测试样本,调用_predict
方法进行单个样本的预测,并将结果保存在y_pred
列表中。最后,将y_pred
转换为 NumPy 数组并返回。 -
_predict
方法用于对单个测试样本进行预测。它计算测试样本与训练样本之间的距离,并选择距离最近的k
个训练样本。然后,统计这k
个样本中出现次数最多的类别,并返回该类别作为预测结果。
-
-
示例数据集:给出了一个简单的示例数据集,包含观看时长和喜好标签。
X_train
是包含观看时长的特征矩阵,y_train
是对应的喜好标签数组。 -
创建并训练 KNN 模型:首先创建一个 KNN 对象
knn
,参数k
设置为 3。然后调用fit
方法,将训练数据集的特征矩阵X_train
和标签数组y_train
传递给模型进行训练。 -
测试数据集:创建一个测试数据集
X_test
,包含一些观看时长。 -
对测试数据进行预测:调用模型的
predict
方法,传入测试数据集X_test
,获得对应的预测结果。 -
打印预测结果:遍历每个测试样本,在控制台上打印观看时长和预测的喜好结果。
三.总结
KNN算法的优点在于它不需要先验知识或者假设数据分布形式,因此比较适合处理非线性或复杂的问题。它还可以处理多类别和多回归问题。
KNN算法的缺点在于当训练集增大时,计算量会快速增加;另外,如果训练样本非常不平衡,那么KNN算法的表现通常不如其他方法。
在使用KNN算法时,需要合理地选择K值和距离度量方式,并对数据进行归一化处理以避免某些特征对结果的影响过大。此外,由于KNN算法依赖于距离计算,如果数据维度很高,那么距离计算会变得非常困难,这时候需要采用降维等技术来解决问题。