大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」
KNN算法的工作原理简单直观,易于理解和实现,这使得它在各种应用场景中备受青睐。
我们将深入探讨KNN算法,从基本概念到实现细节,从算法优化到实际应用,我们都会一一展开。通过本文,你将了解到KNN算法的核心要点,以及如何将这一强大的工具应用到实际问题中。
KNN算法,全称为K-Nearest Neighbors,是一种基于实例的学习算法,或者说是一种基于记忆的学习方法。它的核心思想是,通过一个样本的K个最近邻居的多数属于某个类别,来预测该样本的类别。
KNN算法通过以下步骤进行分类或回归:
KNN算法具有以下显著特点:
在KNN算法中,距离度量是确定样本之间相似性的关键。以下是几种常用的距离度量方法:
确定一个样本的K个最近邻居涉及以下步骤:
在分类任务中,KNN算法通过以下步骤进行决策:
在回归任务中,KNN算法预测一个连续值,通常通过以下步骤:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
# 加载内置的Iris数据集
iris = load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names
# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 数据可视化(选择前两个特征进行可视化)
plt.figure(figsize=(10, 6))
for i, label in enumerate(target_names):
plt.scatter(X[y == i, 0], X[y == i, 1], label=label)
plt.xlabel('特征 1 (标准化)')
plt.ylabel('特征 2 (标准化)')
plt.title('Iris 数据分布')
plt.legend()
plt.show()
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 选择最佳K值
best_k = 1
# 使用最佳K值训练模型
best_knn = KNeighborsClassifier(n_neighbors=best_k)
best_knn.fit(X_train, y_train)
accuracy = best_knn.score(X_test, y_test)
print(f"测试集上的准确率: {accuracy:.2f}")
# 可视化测试结果(选择前两个特征进行可视化)
plt.figure(figsize=(10, 6))
y_pred = best_knn.predict(X_test)
for i, label in enumerate(target_names):
plt.scatter(X_test[y_test == i, 0], X_test[y_test == i, 1], label=f'真实: {label}')
for i, label in enumerate(target_names):
plt.scatter(X_test[y_pred == i, 0], X_test[y_pred == i, 1], marker='x', label=f'预测: {label}')
plt.xlabel('特征 1 (标准化)')
plt.ylabel('特征 2 (标准化)')
plt.title('测试集上的预测结果')
plt.legend()
plt.show()
看运行输出,还是挺强的
选择合适的K值是KNN算法性能的关键因素之一,如下图不同的 K值,K=3 和 K=7 结果就不一样了。
以下是一些选择K值的策略:
选择K值时,可以遵循一些经验法则:
交叉验证是一种更系统的方法来确定最佳的K值。以下是步骤:
以下是使用交叉验证选择K值的Python代码示例:
from sklearn.model_selection import cross_val_score
# 可能的K值列表
k_values = list(range(1, 21))
accuracies = []
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
# 使用交叉验证评估模型性能
accuracy = cross_val_score(knn, X, y, cv=10).mean()
accuracies.append(accuracy)
# 找到最佳K值
best_k = k_values[np.argmax(accuracies)]
print(f"最佳K值为:{best_k}")
运行后输出
啊这,各种类别交织在一起 看起来密集恐惧症都要犯了
为了提高KNN算法的性能和适用性,我们可以采取以下几种优化策略:
选择适当的距离度量对于KNN算法至关重要。根据数据的特性,可以选择不同的度量方法:
在标准KNN中,所有邻居对预测结果的贡献是相等的。然而,我们可以根据距离的远近来分配权重,使得更近的邻居对预测结果有更大的影响。权重可以按照以下公式计算:
高维数据会加剧“维数灾难”,导致KNN算法性能下降。使用降维技术如主成分分析(PCA)可以减少特征维度,同时保留数据的主要信息:
from sklearn.decomposition import PCA
# 应用PCA进行降维
pca = PCA(n_components=2) # 假设我们只保留两个主成分
X_pca = pca.fit_transform(X)
# 现在使用降维后的数据训练KNN模型
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_pca, y)
在机器学习领域,选择正确的算法对于解决特定问题至关重要。KNN算法因其简单性和直观性而广受欢迎,但与其他算法相比,它也有其局限性。以下是KNN算法与几种常见算法的比较:
在本文中,我们深入探讨了KNN算法的各个方面,从基本概念到实现细节,再到优化策略和与其他算法的比较。KNN算法以其简单直观的原理、易于实现的特点以及在小规模和低维数据集上的良好性能,确立了其在机器学习领域中的重要地位。
核心要点总结:
KNN算法虽然简单,但在许多实际应用中表现出色,尤其是在数据集较小且特征维度较低的情况下。然而,它也存在一些局限性,如高计算成本和对噪声的敏感性,这要求我们在应用时需要谨慎考虑。
如过觉得内容有价值,烦请大侠多多 分享、在看、点赞,助力算法金又猛又持久、很黄很 BL 的日更下去;
同时邀请大侠 关注、星标 算法金,围观日更万日,助你功力大增、笑傲江湖