python实现KNN近邻算法

1. 介绍

KNN(k-nearest neighbors)是一种常见的机器学习算法,它基于样本之间的距离进行分类或回归。在本文中,我们将使用Python来实现KNN算法,并解释其原理和应用。

2. KNN算法原理

KNN算法的原理很简单:对于未知样本,根据它与训练样本之间的距离找出最近的k个邻居,然后根据这k个邻居的标签进行分类或回归。

2.1 分类问题

对于分类问题,KNN算法采用多数表决的方式确定未知样本的类别。具体步骤如下:

计算未知样本与所有训练样本之间的距离(常用的距离度量指标有欧氏距离、曼哈顿距离等)。

选取距离最近的k个邻居。

统计这k个邻居的类别标签,并找出出现次数最多的类别。

将未知样本分类为出现次数最多的类别。

2.2 回归问题

对于回归问题,KNN算法采用平均法或加权平均法预测未知样本的值。具体步骤如下:

计算未知样本与所有训练样本之间的距离。

选取距离最近的k个邻居。

计算这k个邻居的平均值或加权平均值。

将未知样本的预测值设置为平均值或加权平均值。

3. Python实现KNN算法

下面我们将使用Python来实现KNN算法。首先,我们需要导入一些必要的库:

import numpy as np

from collections import Counter

3.1 计算距离

计算距离是KNN算法中的关键步骤。我们可以使用欧氏距离来计算样本之间的距离。欧氏距离的计算公式如下:

def euclidean_distance(x1, x2):

return np.sqrt(np.sum((x1 - x2) ** 2))

3.2 KNN分类器

接下来,我们将实现KNN分类器,具体步骤如下:

计算未知样本与所有训练样本之间的距离。

选取距离最近的k个邻居。

统计这k个邻居的类别标签,并找出出现次数最多的类别。

返回未知样本的预测类别。

class KNNClassifier:

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 = Counter(k_nearest_labels).most_common(1)

return most_common[0][0]

4. 示例

我们使用iris数据集作为示例数据集,该数据集包含三种不同类型的鸢尾花,共150个样本。我们将随机选择其中的一部分数据作为训练集,另一部分数据作为测试集。

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

iris = load_iris()

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

knn = KNNClassifier(k=3)

knn.fit(X_train, y_train)

y_pred = knn.predict(X_test)

最后,我们可以通过比较测试集的预测结果和真实标签来评估KNN算法的性能。例如,可以计算准确率、召回率等指标。

5. 总结

本文介绍了KNN算法的原理和应用,并使用Python实现了KNN分类器。KNN是一种简单而有效的机器学习算法,适用于分类和回归问题。在实际应用中,需要选择合适的距离度量指标和邻居个数。此外,KNN算法还可以与其他算法进行集成,提高分类和回归的准确性。

总之,Python实现KNN算法是一项重要且有趣的任务,希望本文的介绍对读者有所帮助。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签