本文将以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算法的实现和使用。