K-近邻算法

KNN是一种常用的监督学习算法,用于解决分类和回归问题。它的基本思想是:如果一个样本在特征空间中的k个最近邻居中的大多数属于某个类别,那么该样本也很可能属于这个类别。因此,KNN算法的核心是根据样本的特征相似度来进行分类或回归预测。

算法原理

K-近邻算法(KNN)是一种基于实例的学习算法,其基本思想是通过计算待分类样本与训练集中每个样本之间的距离,选取与待分类样本距离最近的k个训练样本,根据这k个样本所属的类别来确定待分类样本的类别。KNN算法的核心就是距离度量和K值选择。

具体而言,KNN算法包含以下步骤:

  1. 计算待分类样本与训练集中每个样本之间的距离,常用的距离度量方法包括欧氏距离、曼哈顿距离等。

  2. 选取与待分类样本距离最近的k个训练样本。这里需要根据具体的应用场景来选择合适的k值,通常可以通过交叉验证等方法来确定。

  3. 根据这k个样本所属的类别来确定待分类样本的类别。对于分类问题,通常采用“多数表决”的方式确定待分类样本的类别,即将k个样本中出现最多的类别作为待分类样本的类别。对于回归问题,通常将k个样本的输出值取平均作为待分类样本的输出值。

下面是使用Markdown语言表达KNN算法的原理:

  1. 对于一个未知样本 x x x,计算其与训练集中每个样本 x i x_i xi之间的距离 d ( x , x i ) d(x,x_i) d(x,xi)

  2. 选取与样本 x x x距离最近的 k k k个训练样本,记为 T k ( x ) T_k(x) Tk(x)

  3. 对于分类问题,将 T k ( x ) T_k(x) Tk(x)中出现最多的类别作为样本 x x x的预测类别 y y y;对于回归问题,将 T k ( x ) T_k(x) Tk(x)的输出值取平均作为样本 x x x的预测输出值。

可以用以下公式表示待分类样本 x x x的预测值:

y ^ = arg ⁡ max ⁡ c j ∑ x i ∈ T k ( x ) I ( y i = c j ) \hat{y} = \arg \max_{c_j} \sum_{x_i \in T_k(x)} I(y_i=c_j) y^=argcjmaxxiTk(x)I(yi=cj)

其中, I ( ⋅ ) I(\cdot) I()是指示函数,当括号内的条件成立时, I ( ⋅ ) I(\cdot) I()取值为1,否则取值为0。

代码实现

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

# 加载Wine数据集
wine = load_wine()
X, y = wine.data, wine.target

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

# 设置n_neighbors的候选值
neighbors = list(range(1, 30))

# 交叉验证寻找最优的n_neighbors
best_score = 0
best_n = 0
for n in neighbors:
    knn = KNeighborsClassifier(n_neighbors=n)
    scores = cross_val_score(knn, X_train, y_train, cv=5)
    score = np.mean(scores)
    if score > best_score:
        best_score = score
        best_n = n

# 使用最优的n_neighbors创建KNN分类器对象
knn = KNeighborsClassifier(n_neighbors=best_n)

# 在训练集上训练KNN模型
knn.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = knn.predict(X_test)

# 输出最优的n_neighbors及对应的准确率
print("Best n_neighbors:", best_n)
print("Test set accuracy with best n_neighbors:", knn.score(X_test, y_test))

在实现KNN分类时,首先我们加载了Wine数据集,并将其划分为训练集和测试集。然后通过交叉验证选择最优的k值,并使用KNeighborsClassifier创建KNN分类器对象。在训练集上训练KNN模型,并在测试集上进行预测,计算并输出了最优k值和对应的准确率。这段代码清晰地完成了数据加载、数据集划分、选择最优k值、模型训练和预测的任务。

总结

KNN算法是一种基于实例的学习方法,主要用于分类和回归问题。具体实现时,可以使用距离度量方法(如欧氏距离、曼哈顿距离)来计算样本之间的距离。选择合适的k值很重要,通常可以通过交叉验证等方法来确定。对于分类问题,可以采用多数表决的方式确定待分类样本的类别;对于回归问题,可以将k个样本的输出值取平均作为待分类样本的输出值。总之,KNN算法是一种简单而有效的机器学习算法,可以用于分类和回归问题。其原理简单明了,代码实现也相对简单,但需要根据具体应用场景选择合适的距离度量方法和k值。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐