返回
以独特的视角揭秘KNN算法:从原理到实践,助您轻松理解
人工智能
2023-12-14 07:48:31
一、KNN算法介绍
KNN算法是一种非参数的分类算法。它不需要对数据做任何假设,也不需要训练任何模型。只需要将待分类的样本与训练集中所有样本进行比较,然后根据最近的K个样本的类别来确定待分类样本的类别。
KNN算法的优点是简单易懂,实现方便。而且它对异常值和噪声数据不敏感。但是,KNN算法也有一个缺点,就是计算量大。当训练集很大时,KNN算法的计算量会非常大。
二、KNN算法核心思想
KNN算法的核心思想是:对于一个待分类的样本,通过计算它与训练集中所有样本的距离,选出距离最小的K个样本,然后根据这K个样本的类别来确定待分类样本的类别。
距离的计算方法有多种,常用的距离计算方法有欧氏距离、曼哈顿距离和切比雪夫距离。其中,欧氏距离是最常用的距离计算方法。
K值的选择也很重要。K值的选择会对KNN算法的准确率产生很大的影响。一般来说,K值越大,KNN算法的准确率越高。但是,K值过大会导致计算量过大。因此,在实际应用中,需要根据具体情况来选择K值。
三、KNN算法三要素
KNN算法有三个要素:
- 距离度量:用于计算样本之间的距离。
- K值:用于选择最近的K个样本。
- 分类规则:用于根据最近的K个样本的类别来确定待分类样本的类别。
四、KNN算法优缺点
KNN算法的优点是:
- 简单易懂,实现方便。
- 对异常值和噪声数据不敏感。
KNN算法的缺点是:
- 计算量大。
- 对训练集的大小和分布很敏感。
五、源码简单实现
import numpy as np
import pandas as pd
def knn(X_train, y_train, X_test, k):
"""
KNN算法
Args:
X_train: 训练集特征
y_train: 训练集标签
X_test: 测试集特征
k: 最近邻的数量
Returns:
y_pred: 预测标签
"""
# 计算训练集样本与测试集样本之间的距离
distances = np.linalg.norm(X_train - X_test, axis=1)
# 选择最近的k个训练集样本
k_nearest_indices = np.argsort(distances)[:k]
# 根据最近的k个训练集样本的标签预测测试集样本的标签
y_pred = np.array([y_train[i] for i in k_nearest_indices])
return y_pred
if __name__ == "__main__":
# 加载数据
data = pd.read_csv("data.csv")
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data.drop("label", axis=1), data["label"], test_size=0.2)
# 训练KNN模型
model = knn(X_train, y_train, k=5)
# 预测测试集标签
y_pred = model.predict(X_test)
# 评估模型准确率
accuracy = accuracy_score(y_test, y_pred)
# 打印模型准确率
print("模型准确率:", accuracy)
六、全部代码
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
def knn(X_train, y_train, X_test, k):
"""
KNN算法
Args:
X_train: 训练集特征
y_train: 训练集标签
X_test: 测试集特征
k: 最近邻的数量
Returns:
y_pred: 预测标签
"""
# 计算训练集样本与测试集样本之间的距离
distances = np.linalg.norm(X_train - X_test, axis=1)
# 选择最近的k个训练集样本
k_nearest_indices = np.argsort(distances)[:k]
# 根据最近的k个训练集样本的标签预测测试集样本的标签
y_pred = np.array([y_train[i] for i in k_nearest_indices])
return y_pred
if __name__ == "__main__":
# 加载数据
data = pd.read_csv("data.csv")
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data.drop("label", axis=1), data["label"], test_size=0.2)
# 训练KNN模型
model = knn(X_train, y_train, k=5)
# 预测测试集标签
y_pred = model.predict(X_test)
# 评估模型准确率
accuracy = accuracy_score(y_test, y_pred)
# 打印模型准确率
print("模型准确率:", accuracy)