实现KNN算法的Python函数
1. KNN算法简介
K最近邻(K-Nearest Neighbor,简称KNN)算法是最简单的机器学习分类算法之一。KNN算法是基于实例的,分类中,实例是对象,即记录其属性和类别,属性称为特征,类别称为标签。KNN算法通过计算实例之间的距离来确定样本的类别。在二分类中,给定一个未知类别的样本,算法通过将其与所知道的最近的K个样本进行比较,确定其类别。
2. KNN算法的Python函数实现
KNN算法依赖于距离的计算和排序,我们可以使用numpy和scipy库的函数实现。以下是一个简单的Python函数,使用Euclidean Distance(欧几里得距离)计算最近的K个邻居,并返回相应的类标签。
import numpy as np
from scipy.spatial.distance import cdist
# k-NN classifier
def kNN(X_train, y_train, X_test, k=3):
# Calculate distances between test points and training points
distances = cdist(X_test, X_train)
# Find the k nearest neighbors for each test point
nearest_neighbors_idx = np.argsort(distances)[:, :k]
# Find the majority class label for each test point's k neighbors
nearest_neighbors_labels = y_train[nearest_neighbors_idx]
y_pred = np.array([np.bincount(labels).argmax() for labels in nearest_neighbors_labels])
return y_pred
上述Python函数kNN接受以下参数:
- X_train: 训练数据的特征数据数组,每个样本位于一个行向量中。
- y_train: 训练数据的标签数组,每个标签对应一个样本。
- X_test: 测试数据的特征数据数组,每个样本位于一个行向量中。
- k: 包含于预测中的近邻数,通常为3、5、7等奇数。
下一步是将此函数应用于一个实际的数据集并进行测试。
3. 数据集选择和使用
我们将使用Iris数据集,该数据集包含三个类别和四个特征测量的150个样本。我们将使用Python的scikit-learn库加载数据集,并将其分割为训练和测试集。代码如下:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# Load iris dataset
iris = load_iris()
X, y = iris.data, iris.target
# Split dataset into training (70%) and testing (30%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
print("Number of training samples:", X_train.shape[0])
print("Number of testing samples:", X_test.shape[0])
结果如下:
Number of training samples: 105 Number of testing samples: 45
4. 运行和测试KNN
现在我们已经拥有了一些数据,我们可以将其输入到我们的kNN算法中进行分类。我们将为kNN函数设置k值为3,并使用X_train和y_train拟合算法,然后用X_test测试算法并查看模型的性能。代码如下:
# Run kNN algorithm with k=3 and evaluate its performance
y_pred = kNN(X_train, y_train, X_test, k=3)
print("Accuracy:", np.mean(y_pred == y_test))
结果如下:
Accuracy: 0.9777777777777777
5. 总结
KNN是一个简单但有效的算法,可以用于解决许多分类问题。在本文中,我们实现了KNN算法的Python函数,并将其应用于Iris数据集进行测试。我们发现,算法在测试集上的分类效果达到了97.8%。我们可以使用这个函数和其他函数来实现更复杂的机器学习算法,例如分类和回归问题。
