引言:本文是我学习完K邻近算法后自我总结的一些心得,以及对K邻近算法实现的总结。
一 KNN概述
K 近邻(K-Nearest Neighbor, KNN)是一种监督学习算法。KNN是通过测量不同特征值之间的距离进行分类。
二 KNN原理
K 近邻算法简称 KNN 算法,由 Cover 和 Hart 在 1968 年提出,是一种基本分类与回归方法。K 近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。K 近邻的一个常用的实现方法是 kd 树( KD-Tree ),可以做到以空间换时间的效果。
思路:如果一个样本在特征空间中的 K 个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
因此,给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 K 个实例,这 K 个实例的多数属于某个类,就把该输入实例分类到这个类中。
一个例子:下图中,要决定绿色圆是被分成红色三角形一类还是蓝色四方形一类?
如果 K=3(黑色实线圆圈中),由于红色三角形所占比例为 2/3 ,绿色圆将被归为红色三角形类,如果 K=5(黑色虚线圆圈中),由于蓝色四方形比例为 3/5 ,因此绿色圆被归为蓝色四方形类。
三 KNN的优缺点
KNN(K-Nearest Neighbors)是一种经典的机器学习算法,它基于实例之间的相似度进行分类或回归预测。下面是KNN算法的一些优缺点:
优点:
- 简单易懂:KNN是一种直观的算法,其核心理念是寻找最近邻的样本来进行分类,易于理解和实现。
- 无需训练:KNN是一种无参数学习算法,不需要在训练阶段构建模型,可以直接使用训练样本进行分类或回归预测。
- 非线性决策边界:KNN对数据的分布没有假设,适用于各种类型的数据集,可以处理非线性的分类问题。
- 懒惰学习:KNN属于懒惰学习(Lazy Learning),它在预测阶段才进行计算,可以动态适应新的训练数据。
缺点:
- 计算复杂度高:KNN需要计算测试样本与所有训练样本之间的距离,随着训练样本数量的增加,计算复杂度呈现线性增长。
- 需要大量内存:KNN需要存储所有的训练样本,当训练样本数量庞大时,需要占用较大的内存空间。
- 数据不平衡问题:KNN对于样本不平衡的数据集表现不佳,如果某个类别的训练样本数量远多于其他类别,KNN会有偏向性。
- 参数选择困难:KNN的性能与K值(即最近邻的个数)相关,选择合适的K值对结果影响较大,但如何选择合适的K值通常是一个挑战。
总结起来,KNN算法简单直观,适用于各种类型的数据集,但计算复杂度高、内存消耗大和对参数选择敏感等缺点限制了它在大规模和高维数据上的应用。因此,在实际应用中,我们需要根据具体情况权衡KNN算法的优缺点并选择合适的算法。
四 KNN的一般流程
- 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。
- 准备数据:可以使用python解析,预处理数据
- 分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。
- 特征工程:标准化,KNN数据需要进行标准化
- 进行算法流程:得出预测结果,计算准确率
- 使用算法:准确率在可接受的范围,就可以运行K-近邻算法进行分类
五 K 近邻分类实例操作
K近邻(K-Nearest Neighbors,KNN)是一种用于分类和回归的非参数监督学习算法。下面是K近邻分类的实例操作步骤:
-
准备数据集:收集并准备包含特征和标签的训练数据集,其中特征是用于分类的属性值,标签是相应的类别。
-
选择K值:确定要使用的K值,即最近邻样本的数量。这可以通过交叉验证或其他模型评估方法来选择。
-
计算距离:对于给定的测试样本,计算它与训练集中所有样本之间的距离。常用的距离度量方法包括欧氏距离、曼哈顿距离等。
-
选择最近邻:根据距离值选择最接近测试样本的K个训练样本作为它的最近邻。
-
确定类别:根据K个最近邻的标签,使用投票或加权投票的方式确定测试样本的类别。即选择出现频率最高的类别作为测试样本的预测结果。
-
输出预测结果:将测试样本预测的类别作为最终的分类结果输出。
下面是一个简单的Python代码示例:
# 导入相关库 from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 准备数据集 X = [[2.0, 3.0], [1.0, 4.0], [3.0, 6.0], [4.0, 2.0]] y = [0, 0, 1, 1] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建K近邻分类器对象 knn = KNeighborsClassifier(n_neighbors=3) # 拟合模型 knn.fit(X_train, y_train) # 预测 y_pred = knn.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print("准确率:", accuracy)
这个例子中,我们使用了一个简单的数据集,包含两个特征和两个类别。首先,我们将数据集划分为训练集和测试集。然后,创建K近邻分类器对象,设置K值为3。接着,使用训练集对模型进行拟合。最后,使用测试集进行预测,并计算准确率作为评估指标。
请注意,这只是一个简单的示例,实际中可能需要进行更多的数据处理、参数调优和性能评估等操作。
六 基于K近邻算法的分类器的实现
下面是一个基于K近邻算法的分类器的简单实现示例:
# 导入相关库
import numpy as np
class KNNClassifier:
def __init__(self, k):
self.k = k
def fit(self, X, y):
self.X_train = X
self.y_train = y
def euclidean_distance(self, x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
def predict(self, X):
y_pred = []
for x_test in X:
distances = []
for x_train in self.X_train:
distance = self.euclidean_distance(x_test, x_train)
distances.append(distance)
nearest_indices = np.argsort(distances)[:self.k]
nearest_labels = self.y_train[nearest_indices]
unique_labels, counts = np.unique(nearest_labels, return_counts=True)
label_pred = unique_labels[np.argmax(counts)]
y_pred.append(label_pred)
return np.array(y_pred)
# 准备数据集
X_train = np.array([[2.0, 3.0], [1.0, 4.0], [3.0, 6.0], [4.0, 2.0]])
y_train = np.array([0, 0, 1, 1])
X_test = np.array([[1.5, 3.5], [3.5, 5.5]])
# 创建KNN分类器对象
knn = KNNClassifier(k=3)
# 拟合模型
knn.fit(X_train, y_train)
# 预测
y_pred = knn.predict(X_test)
print("预测结果:", y_pred)
在这个示例中,我们定义了一个名为KNNClassifier
的类,其中包含了fit
、euclidean_distance
和predict
方法。fit
用于训练模型,接收训练数据集X_train和标签y_train作为输入;euclidean_distance
计算两个样本之间的欧氏距离;predict
根据输入的测试数据集X进行预测,并返回预测结果。
我们使用NumPy库来处理数组操作和数学计算。在示例中,我们准备了一个简单的训练数据集(X_train
和y_train
)和测试数据集(X_test
)。然后,我们创建了一个KNN分类器对象(k=3),并调用fit
方法进行训练。最后,使用测试数据集进行预测,并打印出预测结果。
请注意,这是一个简化的示例实现,并没有涵盖KNN算法的所有细节和优化。实际应用中,可能需要考虑更多的因素,例如距离权重、处理离散特征、特征缩放等。此外,还需要进行模型评估和调参等工作来提高分类器的性能。
七 总结
K近邻(K-Nearest Neighbors,KNN)是一种常用的监督学习算法,适用于分类和回归任务。本文对KNN算法做一个总结:
-
算法思想:KNN算法是一种基于实例的学习方法,基本思想是利用训练集中的样本来进行预测。对于一个新样本,KNN算法会查找与其最接近的K个训练样本,并基于这K个训练样本的标签进行预测。
-
距离度量:KNN算法通常使用欧氏距离、曼哈顿距离等距离度量方法来计算样本之间的相似性或距离。
-
K值的选择:KNN算法中的一个重要参数是K值,即选择最近邻的数量。一般来说,选择较小的K值可能会导致模型过拟合,而选择较大的K值可能会导致模型欠拟合。通常可以通过交叉验证或其他模型评估方法来选择合适的K值。
-
加权投票:KNN算法中,我们常用一种称为加权投票的策略,来决定最终预测结果。即将最近邻样本的标签作为预测值,但是要根据与测试样本的距离来赋予权重。
-
缺点:KNN算法的主要缺点是计算复杂度高,尤其是当训练集很大时。此外,KNN算法对于高维数据和不平衡数据可能会受到影响,需要进行特殊处理。
总之,KNN算法是一种简单而有效的分类和回归方法,特别适用于小型数据集和复杂度不高的问题。但在实际应用中,需要对其进行优化和调整,才能达到更好的性能和效果。
以上就是我对KNN的理解与看法,如果有不足的地方还希望大家纷纷指出,谢谢各位的阅读。