【AI知识】KNN算法原理代码示例可视化
KNN(K-Nearest Neighbors,K最近邻)是一种监督学习算法,常用于分类和回归任务。它的核心思想是:一个样本的类别,由其k个最近邻的样本中的多数类决定。 以下是KNN的详细介绍:
1. 选择K值: 选择一个正整数K,通常K值的选择会影响模型的性能。较小的K值会使模型对噪声敏感,而较大的K值可能会导致模型过于平滑,无法捕捉数据的细节。
2.计算距离: 对于待分类的点,计算其与训练集中每个点的距离。常用的距离度量包括:欧氏距离、曼哈顿距离、闵可夫斯基距离
3.选择邻居: 根据计算的距离,选择距离最小的K个邻居。
4.进行预测:
- 分类:对K个邻居的类别进行投票,选择出现次数最多的类别作为预测结果。
- 回归:对K个邻居的值取平均,作为预测结果。
KNN的优点:
- 简单易懂: KNN算法直观,易于实现。
- 无需训练: KNN是一种懒惰学习算法,只有在进行预测时才进行计算,不需要提前训练模型。
KNN的缺点:
- 计算量大: 每次分类都需要计算新样本与所有训练样本的距离,尤其是对于大数据集。
- 选择K值困难: K值的选取对分类结果影响很大,没有一个普适的最佳K值选择方法。
- 对噪声敏感: 噪声数据可能会对分类结果产生较大的影响。
- **维度灾难:**在高维特征空间中,距离计算的意义会变得模糊,影响分类效果。
KNN的应用场景:
- 推荐系统: 根据用户的历史行为数据,找到与用户兴趣最相似的其他用户,然后向用户推荐这些用户喜欢的物品。
- 文本分类: 将文本文档分成不同的类别,比如新闻分类、情感分析等。
- 图像识别: 根据图像的特征,将图像分到不同的类别。
KNN代码示例&可视化:
import numpy as np
import matplotlib.pyplot as plt
# 计算欧氏距离
def euclidean_distance(point1, point2):
return np.sqrt(np.sum((point1 - point2) ** 2))
# KNN分类器
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):
predictions = [self._predict(x) for x in X]
return np.array(predictions)
def _predict(self, x):
# 计算与所有训练样本的距离
distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
# 获取最近的K个邻居的索引
k_indices = np.argsort(distances)[:self.k]
# 获取这些邻居的标签
k_nearest_labels = [self.y_train[i] for i in k_indices]
# 进行投票
most_common = np.bincount(k_nearest_labels).argmax()
return most_common
# 生成简单数据
def create_data():
np.random.seed(0)
X = np.concatenate((np.random.randn(50, 2) + [1, 1], np.random.randn(50, 2) + [5, 5]))
y = np.array([0] * 50 + [1] * 50)
return X, y
# 可视化函数
def visualize(X_train, y_train, X_test, predictions):
plt.figure(figsize=(10, 6))
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, marker='o', label='Training Data', alpha=0.6)
plt.scatter(X_test[:, 0], X_test[:, 1], c=predictions, marker='x', label='Predictions', alpha=0.8)
plt.title('KNN Classification')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.grid()
plt.show()
# 主程序
X, y = create_data()
X_test = np.array([[2, 2], [3, 3], [4, 4], [6, 6]]) # 测试样本
knn = KNN(k=3)
knn.fit(X, y)
predictions = knn.predict(X_test)
visualize(X, y, X_test, predictions)
KNN后的可视化结果: