K 最近邻分类,分类:监督机器学习

王林
发布: 2024-07-19 14:58:38
原创
839 人浏览过

k-最近邻分类

定义和目的

k-最近邻 (k-NN) 分类是一种非参数、基于实例的学习算法,用于机器学习,根据特征空间中最近邻的类别对数据点进行分类。它通过考虑数据点的 k 个最近邻的类别来为数据点分配类别。 k-NN 分类的主要目的是利用与现有标记数据的相似性来预测新数据点的类别。

主要目标:

  • 分类:根据最近邻居的多数投票或加权投票将新数据点分配给预定义的类别之一。
  • 估计:确定数据点属于特定类别的可能性。
  • 理解关系:识别特征空间中哪些数据点相似。

k-NN 分类的工作原理

1。距离度量:该算法使用距离度量(通常为欧几里德距离)来确定数据点的“接近程度”。

  • 欧几里得距离
    • d(p, q) = sqrt((p1 - q1)^2 + (p2 - q2)^2 + ... + (pn - qn)^2)
    • 测量 n 维空间中两点 p 和 q 之间的直线距离。

2。选择 k:参数 k 指定做出分类决策时要考虑的最近邻居的数量。

  • 小 k:可能导致过度拟合,即模型对训练数据过于敏感。
  • 大 k:可能导致欠拟合,即模型过于泛化,可能会错过数据中更精细的模式。

3。多数投票:新数据点的预测类别是其 k 个最近邻居中最常见的类别。

  • 多数票
    • 统计每个类别在 k 个邻居中出现的次数。
    • 将计数最高的类分配给新数据点。

4。加权投票:在某些情况下,邻居会根据距离进行加权,距离较近的邻居对分类的影响更大。

  • 加权投票
    • 通过距离的倒数来衡量每个邻居的投票。
    • 对每个班级的加权投票进行求和。
    • 将加权总和最高的类分配给新数据点。

关键概念

  1. 非参数:k-NN 是一种非参数方法,这意味着它不对数据的基本分布做出任何假设。这使得它可以灵活地处理各种类型的数据。

  2. 基于实例的学习:该算法存储整个训练数据集并根据数据中的局部模式进行预测。它也被称为“惰性”学习算法,因为它会延迟处理直到发出查询。

  3. 距离计算:距离度量的选择可以显着影响模型的性能。常见指标包括欧几里德距离、曼哈顿距离和闵可夫斯基距离。

  4. k 的选择:k 的值是一个关键的超参数。交叉验证通常用于确定给定数据集的最佳 k 值。

k-最近邻 (k-NN) 分类示例

k-最近邻 (k-NN) 分类是一种非参数、基于实例的学习算法,用于根据最近邻的类别对数据点进行分类。此示例演示如何使用合成数据实现用于多类分类的 k-NN、评估模型的性能以及可视化三个类的决策边界。

Python 代码示例

1。导入库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
登录后复制

此块导入数据操作、绘图和机器学习所需的库。

2。生成 3 个类的样本数据

np.random.seed(42)  # For reproducibility
n_samples = 300

# Class 0: Cluster at the top-left corner
X0 = np.random.randn(n_samples // 3, 2) * 0.5 + [-2, 2]

# Class 1: Cluster at the top-right corner
X1 = np.random.randn(n_samples // 3, 2) * 0.5 + [2, 2]

# Class 2: Cluster at the bottom-center
X2 = np.random.randn(n_samples // 3, 2) * 0.5 + [0, -2]

# Combine all classes
X = np.vstack((X0, X1, X2))
y = np.array([0] * (n_samples // 3) + [1] * (n_samples // 3) + [2] * (n_samples // 3))
登录后复制

此块为位于特征空间不同区域的三个类生成合成数据。

3。分割数据集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
登录后复制

此块将数据集拆分为训练集和测试集以进行模型评估。

4。创建并训练 k-NN 分类器

k = 5  # Number of neighbors
knn_classifier = KNeighborsClassifier(n_neighbors=k)
knn_classifier.fit(X_train, y_train)
登录后复制

此块使用指定数量的邻居初始化 k-NN 分类器,并使用训练数据集对其进行训练。

5。做出预测

y_pred = knn_classifier.predict(X_test)
登录后复制

此块使用经过训练的模型对测试集进行预测。

6. Evaluate the Model

accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
登录后复制

Output:

Accuracy: 1.00

Classification Report:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        22
           1       1.00      1.00      1.00        16
           2       1.00      1.00      1.00        22

    accuracy                           1.00        60
   macro avg       1.00      1.00      1.00        60
weighted avg       1.00      1.00      1.00        60
登录后复制

This block calculates and prints the accuracy and classification report, providing insights into the model's performance.

7. Visualize the Decision Boundary

h = 0.02  # Step size in the mesh
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

Z = knn_classifier.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.figure(figsize=(12, 8))
plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.RdYlBu, edgecolors='black')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title(f'k-NN Classification (k={k})')
plt.colorbar()
plt.show()
登录后复制

This block visualizes the decision boundaries created by the k-NN classifier, illustrating how the model separates the three classes in the feature space.

Output:

knn classification

This structured approach demonstrates how to implement and evaluate k-NN for multiclass classification tasks, providing a clear understanding of its capabilities and the effectiveness of visualizing decision boundaries.

以上是K 最近邻分类,分类:监督机器学习的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!