如何实现一个KNN算法
教你如何自己实现KNN算法 KNN算法,也称为K邻近算法,可以解决回归和分类问题,但解决分类问题才是它的优势。 KNN算法的本质就是寻找与我们提供的数据相似的k个样本,然后判断这k个样本的标签,最后统计每个标签出现的次数,次数最多的标签,就会被当作我们提供的数据的标签。 先说说工作流程: 机器学习是基于数据的,所以要先将实物转换为向量、矩阵或张量的形式 通过欧式距离计算出测试样本与其他样本之间的距离 将距离按照小到大排序,并取前K个值 判断前K个值相应的标签,并进行统计 统计最多的标签即为预测结果 现在我们来动手实现一下 先导入所有需要导入的库或模块 # 导入sklearn自带的数据集 fro KNN(K-Nearest Neighbors)算法是一种基础且实用的监督学习方法,主要用于分类和回归问题。在本文中,我们将深入理解KNN算法的工作原理,并通过Python代码实现一个简单的KNN分类器。 KNN算法的核心思想是“物以类聚”,即一个样本的类别由其最近邻的K个样本的类别决定。对于分类任务,KNN通过以下步骤完成预测: 1. **数据预处理**:我们需要将原始数据转换为数值型,通常是向量、矩阵或张量的形式,以便于计算。 2. **计算距离**:使用某种距离度量方法衡量样本间的相似性,最常见的距离计算方法是欧氏距离。欧氏距离定义为两个样本向量元素之间差的平方和的平方根。在Python中,我们可以利用numpy库来计算。 ```python import numpy as np def eus_dis(instance1, instance2): '''计算两个样本之间的欧氏距离''' distance = np.sqrt(sum((instance1-instance2)**2)) return distance ``` 3. **寻找最近邻**:计算测试样本与训练集中每个样本的距离,然后按升序排列,选取距离最小的K个样本作为最近邻。 ```python # 使用numpy的argsort函数找到距离排序后的索引 kneighbors = np.argsort(distances)[:k] ``` 4. **类别统计**:统计这K个最近邻的标签出现次数,使用Python的collections.Counter对象可以轻松完成。 ```python from collections import Counter count = Counter(Y[kneighbors]) ``` 5. **决策**:选择出现次数最多的类别作为预测结果。Counter对象的most_common()方法可以返回出现频率最高的元素。 ```python return count.most_common()[0][0] ``` 6. **模型评估**:为了评估模型的性能,我们将数据集分为训练集和测试集,然后计算预测结果与实际结果相符的样本比例,即预测准确率。 ```python from sklearn.model_selection import train_test_split from sklearn import datasets # 加载数据集,例如iris data = datasets.load_iris() X_train, X_test, Y_train, Y_test = train_test_split(data.data, data.target, random_state=2000) # 预测并计算准确率 predirect = [KnnClassify(X_train, Y_train, test, 5) for test in X_test] count = np.count_nonzero((predirect == Y_test) == True) accuracy = count / len(X_test) print(f"该模型的预测准确率为:{accuracy:.3f}") ``` 这个简单的实现中,我们使用了sklearn库的内置数据集iris和train_test_split函数进行数据划分。注意,为了确保每次运行结果的一致性,我们设定了random_state参数。KNN算法中的K值是一个超参数,通常需要通过交叉验证来确定最优值。 总结起来,KNN算法是一种基于实例的学习方法,它依赖于样本之间的距离计算,适用于小规模数据集。然而,由于需要计算所有样本的距离,KNN在大规模数据集上可能效率较低。此外,它还受到异常值的影响,以及对特征尺度敏感。在实际应用中,往往需要对数据进行预处理,如归一化或标准化,以优化性能。尽管有这些限制,KNN仍然是理解和实践机器学习的一个重要起点。