k-近邻算法(kNN)-python实现

1.k-近邻算法概述

1.1 定义

k近邻算法(K-Nearest Neighbors, KNN)是一种常用的监督学习算法,用于解决分类和回归问题。该算法基于特征空间中的距离度量,即对于一个未知样本,通过计算其与训练集中的各个样本之间的距离,然后选择距离最近的k个样本,根据这k个样本的类别进行投票(对于分类问题)或计算平均值(对于回归问题),来确定未知样本的类别或值。k-近邻算法的核心思想是,如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别。

1.2 基本原理

k-近邻算法的基本原理是,对于给定的一个待分类的样本,我们会在特征空间中寻找与其距离最近的k个样本(这k个样本被称为邻居)。然后,我们会查看这k个邻居中大多数属于哪个类别,并将这个类别作为待分类样本的预测类别。

1.3 k-近邻算法的一般流程

(1)收集数据:可以使用任何方法。

(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式。

(3)分析数据:可以使用任何方法。

(4)训练算法:此步骤不适用于k-近邻算法。

(5)测试算法:计算错误率。

(6)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

1.4 算法实现

def classify0(inX,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX,(dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    classCount={}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(votrIlabel,0) + 1
    sorteClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

2.k-近邻算法实例-预测水果类型

假设有一个数据集,其中包含了一些水果的特征(如颜色、大小、形状等),以及对应的标签(是苹果还是橙子)。经训练分类后,给定一个新的水果的特征,判断它是什么类型的水果。

定义kNN类:

class KNN:
    #初始化方法,接受一个参数k,默认为3,表示选择最近邻居的数量
    def __init__(self, k=3):
        self.k = k
    #训练方法,接受特征数据X和标签数据y作为输入,分别存入类的属性X_train和y_train中
    def fit(self, X, y):
        self.X_train = X
        self.y_train = y
    #预测方法,接受特征数据X作为输入,返回预测的标签值
    def predict(self, X):
        y_pred = [self._predict(x) for x in X]
        return np.array(y_pred)
    #内部方法,预测单个样本x的标签值
    def _predict(self, x):
        # 计算距离
        distances = [np.linalg.norm(x - x_train) for x_train in self.X_train]
        # 获取k个最近邻居的索引
        k_indices = np.argsort(distances)[:self.k]
        # 获取k个最近邻居的标签
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        # 返回最常见的标签作为预测结果
        most_common = max(set(k_nearest_labels), key=k_nearest_labels.count)
        return most_common

训练数据 :

X_train = np.array([
    [1, 2, 3],
    [2, 3, 4],
    [3, 4, 5],
    [4, 5, 6],
    [5, 6, 7],
    [6, 7, 8]
])

训练结果:

y_train = np.array(['apple', 'apple', 'apple', 'orange', 'orange','orange'])

测试数据:

X_new = np.array([
    [3.5, 4.5, 5.5],
    [6.5, 7.5, 8.5]
])

测试结果:

在这个示例中,我们使用三维特征(颜色、大小、形状)来区分苹果和橙子。kNN类包含了一个fit方法来存储训练数据,一个predict方法来预测新数据的标签,以及一个_predict方法来为单个数据点进行预测。在_predict方法中,我们计算了新数据点与每个训练数据点之间的距离,找到了 距离最近的k个邻居,并返回了这些邻居中最常见的标签作为预测结果。

完整代码:

import numpy as np
class KNN:
    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 = [np.linalg.norm(x - x_train) for x_train in self.X_train]
        # 获取k个最近邻居的索引
        k_indices = np.argsort(distances)[:self.k]
        # 获取k个最近邻居的标签
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        # 返回最常见的标签作为预测结果
        most_common = max(set(k_nearest_labels), key=k_nearest_labels.count)
        return most_common
# 示例数据
X_train = np.array([
    [1, 2, 3],
    [2, 3, 4],
    [3, 4, 5],
    [4, 5, 6],
    [5, 6, 7],
    [6, 7, 8]
])
y_train = np.array(['apple', 'apple', 'apple', 'orange', 'orange','orange'])
# 创建KNN分类器
knn = KNN(k=3)
# 训练模型
knn.fit(X_train, y_train)
# 预测新数据
X_new = np.array([
    [3.5, 4.5, 5.5],
    [6.5, 7.5, 8.5]
])
y_pred = knn.predict(X_new)
print(y_pred)  # 输出预测结果

3.k-近邻算法总结

k-近邻算法是分类数据最简单最有效的算法,它是基于实例的学习,使用算法时我们必须有接近实际数据的训练样本数据。k-近邻算法必须保存全部数据集,如果训练的数据集很大,必须使用大量的存储空间。k-近邻算法的优点包括简单易理解、无需训练过程等,缺点包括计算复杂度高、对异常值敏感等。在实际应用中,我们需要根据具体问题选择合适的k值和距离度量方法,以获得更好的分类或回归效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ohoh。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值