📜  项目 | kNN |分类 IRIS 数据集(1)

📅  最后修改于: 2023-12-03 15:28:53.735000             🧑  作者: Mango

项目 | kNN | 分类 IRIS 数据集

介绍

在机器学习领域,k-近邻算法(k-Nearest Neighbor, kNN)是一种常见的分类算法。该算法的基本思路是:对于一个新的测试样本,找到训练集中与之最相似的k个样本,然后将这k个样本的分类结果进行统计,以获得测试样本最终的分类结果。在实际应用中,kNN算法被广泛应用于分类、回归和密度估计等多个领域。

为了说明kNN算法的基本流程和用法,我们将以IRIS数据集进行分类。IRIS数据集是一个常用的数据集,包含3种不同品种的鸢尾花(Iris Setosa、Iris Versicolour和Iris Virginica),每种品种各有50个样本,共计150个样本。将这些样本的萼片长度、萼片宽度、花瓣长度和花瓣宽度等属性作为特征,我们可以使用kNN算法对这些样本进行分类。

在本次项目中,我们将使用Python编写kNN算法,并利用该算法对IRIS数据集进行分类。

代码实现
1. 导入所需的库
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
2. 加载IRIS数据集
iris = load_iris()
X = iris.data           # 特征
y = iris.target         # 标签
3. 数据集的划分

为了对我们编写的kNN算法进行评估和测试,我们需要将原始数据集划分为训练集和测试集,其中训练集用于训练模型,测试集用于评估模型的性能。在本示例中,我们将80%的样本用于训练,20%的样本用于测试。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
4. kNN算法实现

基于上述IRIS数据集的特点,我们可以按照以下步骤实现kNN算法:

  • 定义距离函数
  • 选取k个最近邻居
  • 对邻居进行统计
  • 返回测试样本的分类结果

具体实现如下所示:

class KNN():
    def __init__(self, k=5):
        self.k = k
    
    # 定义欧氏距离度量函数
    def euclidean_distance(self, x1, x2):
        return np.sqrt(np.sum((x1 - x2)**2))
    
    # 选取最近的k个邻居
    def nearest_neighbors(self, X_train, y_train, x_test):
        distances = [self.euclidean_distance(x, x_test) for x in X_train]
        k_idx = np.argsort(distances)[:self.k]
        k_nearest_neightbors = [y_train[i] for i in k_idx]
        return k_nearest_neightbors
    
    # 统计邻居中出现最多的类别
    def majority_vote(self, k_nearest_neightbors):
        counts = np.bincount(k_nearest_neightbors)
        return np.argmax(counts)
    
    # 对测试样本进行分类
    def predict(self, X_train, y_train, X_test):
        predictions = []
        for X_test_sample in X_test:
            k_nearest_neightbors = self.nearest_neighbors(X_train, y_train, X_test_sample)
            majority = self.majority_vote(k_nearest_neightbors)
            predictions.append(majority)
        return predictions
5. 模型的训练和测试
knn = KNN(k=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集上的准确率为: {accuracy:.2f}")
总结

本文通过实例演示了如何基于kNN算法对IRIS数据集进行分类。通过对以上代码进行修改和扩展,我们还可以实现以下功能:

  • 为kNN算法添加加权距离,以调整各个特征对模型的影响力
  • 实现不同的距离度量函数,并通过对算法的参数进行调整,来比较不同距离度量函数对算法性能的影响
  • 更改距离函数的形式,以进行回归或密度估计等其他机器学习任务。