【理解机器学习算法】之KNN(纯Python)

实现 K-最近邻 (KNN) 算法涉及几个关键步骤:计算点之间的距离、找到最近的邻居以及基于这些邻居进行预测。下面是用 Python 从头开始实现 KNN 分类的简单示例。这个例子将帮助你理解 KNN 背后的核心机制。

步骤 1:计算距离

首先,我们需要一个函数来计算两点之间的距离。通常使用欧几里得距离来实现这一目的。

import numpy as np

def euclidean_distance(point1, point2):
    return np.sqrt(np.sum((point1 - point2) ** 2))

步骤 2:KNN 模型

KNN 模型将包括用于拟合数据的方法(对于 KNN 而言,就是存储数据集)和预测新点类别的方法。

class KNN:
    def __init__(self, k=3):
        self.k = k
        self.X_train = None
        self.y_train = None

    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):
        # 计算 x 与训练集中所有样本之间的距离
        distances = [euclidean_distance(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

步骤 3:测试实现

要测试这个实现,我们可以使用一个简单的数据集。这里,我们将使用 `sklearn` 的 `make_classification` 来创建一个数据集,然后应用我们的 KNN 分类器。

from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification

# 创建一个数据集
X, y = make_classification(n_samples=100, n_features=4, n_classes=2, random_state=42)

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化我们的 KNN
knn = KNN(k=3)

# 拟合模型
knn.fit(X_train, y_train)

# 进行预测
predictions = knn.predict(X_test)

# 计算准确率
accuracy = np.sum(predictions == y_test) / len(y_test)
print(f"准确率: {accuracy}")

这个简单的实现提供了对 KNN 工作原理的清晰理解。然而,在实践中,对于更大的数据集和更复杂的应用,使用像 `scikit-learn` 这样的优化库会更有效。上述实现没有包括使用数据结构(如 KD-树或球树)进行更快速距离计算的优化,这对于处理大型数据集至关重要。

KNN是一种懒惰学习算法,其中所有计算都推迟到预测时进行。对于KNN来说,"训练"阶段实际上只涉及存储数据集。在传统意义上(像在线性回归中拟合一条线或在决策树算法中构建一棵树),并没有从训练数据中构建模型的过程。所以,当我们说.fit(X, y)时,本质上是在记忆训练数据集,这些数据集稍后将在预测阶段用于根据距离度量找到'k'个最近的邻居。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Thinking in Stock

您的鼓励是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值