首页 > 编程知识 正文

KNN分类算法Python实现

时间:2023-11-22 05:26:14 阅读:289994 作者:YPYA

本文将以Python语言为中心,介绍KNN分类算法的实现过程。KNN分类算法是一种常见的机器学习算法,用于分类和回归分析。其中,分类问题指的是给定一个新的数据点,将其归为训练集中的某个类别;回归问题指的是给定一个新的数据点,预测其数值。KNN算法的核心思想是将新点与最近相邻点进行比较,根据相邻点所属的分类或数值确定新点的分类或数值。

一、KNN算法的实现过程

在实现KNN算法之前,需要先了解其实现过程。该过程包含以下几个步骤:

1、计算测试样本与训练集样本之间的距离

2、按照距离的大小从小到大排序,获取前K个距离最小的样本

3、统计K个样本中分类出现的频率

4、将测试样本归为出现频率最高的分类

二、KNN算法的Python代码实现

1、导入库


import numpy as np
import pandas as pd
from collections import Counter

2、读取数据

数据集选用Iris鸢尾花数据集。


data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data')
data.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']
data.head()

3、拆分数据集

将数据集按7:3的比例拆分为训练集和测试集。


train_data = data[:105]
test_data = data[105:]

4、计算距离

在此使用欧氏距离计算测试集样本与训练集样本之间的距离。


def euclideanDistance(x1, x2):
    return np.sqrt(np.sum(np.square(x1 - x2)))

def getDistances(test_sample, train_data):
    distances = []
    for i in range(len(train_data)):
        distances.append((euclideanDistance(test_sample, train_data.iloc[i, :-1]), i))
    return distances

5、K值选择

K值的选择会影响KNN算法的结果。通常选择奇数,以防止平票情况。在此将K值设置为5。


k = 5

6、统计K个最近邻样本的分类出现频率


def predict(test_sample, train_data, k):
    distances = getDistances(test_sample, train_data)
    top_k = sorted(distances, key=lambda x: x[0])[:k]
    top_k_classes = [train_data.iloc[i, -1] for _, i in top_k]
    label = Counter(top_k_classes).most_common()[0][0]
    return label

7、对测试集进行预测

使用上述方法对测试集进行预测,并将预测结果保存至predictions数组。


predictions = []
for i in range(len(test_data)):
    predictions.append(predict(test_data.iloc[i, :-1], train_data, k))
print(predictions)

三、KNN算法的优化

上述代码实现了K值为5的KNN算法,但仍有一些可以进行优化的地方。

1、KD树

KD树是一种可用于对数据集进行高效处理的树形数据结构。它通过对数据的递归分割,将高维数据集划分为小数据块,从而加快了KNN算法的速度。

以下是使用KD树实现KNN算法的示例代码:


from sklearn.neighbors import KDTree

kdt = KDTree(train_data.iloc[:, :-1])
distances, indices = kdt.query(test_data.iloc[:, :-1], k=k)
predictions_kdt = [Counter(train_data.iloc[indices[i], -1]).most_common()[0][0] for i in range(len(test_data))]

2、特征缩放

特征缩放是指将数据集进行规范化或标准化处理,以消除不同特征间的量纲差异。例如,在Iris数据集中,花萼长度与花瓣长度的量纲是不同的。特征缩放可使数据更加稳定,避免因量纲问题造成的分类错误。

以下是使用特征缩放实现KNN算法的示例代码:


from sklearn.preprocessing import StandardScaler

scaler = StandardScaler().fit(train_data.iloc[:, :-1])
train_data_new = pd.concat([pd.DataFrame(scaler.transform(train_data.iloc[:, :-1]), columns=data.columns[:-1]), train_data['class']], axis=1)
test_data_new = pd.concat([pd.DataFrame(scaler.transform(test_data.iloc[:, :-1]), columns=data.columns[:-1]), test_data['class']], axis=1)

四、总结

本文介绍了KNN分类算法的基本原理和Python实现过程,同时也简单介绍了KNN算法的优化方法。使用KNN算法要注意K值的选择以及特征缩放等问题。通过本文的学习,读者可以更好地掌握KNN算法的实现和使用。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。