K近邻(KNN)算法(算法原理+简单的实现)

一.基本概念

1.1概念

K近邻算法(K-Nearest Neighbors,KNN)是一种基本的机器学习算法,也是一种分类和回归方法。它的原理很简单,即根据特征相似度来进行分类或回归预测。 K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一。

在KNN算法中,首先需要给定一个训练集,其中包含了已知分类标签的样本数据。

然后,通过计算待预测样本与训练集中各个样本的特征距离,选择与待预测样本最相似的K个训练样本(即K个最近邻)

并根据这K个并据这K个最近邻样本的分类标签来对待预测样本进行分类或回归预测。

1.2基本步骤

  1. 训练集:KNN算法需要已知分类标签的训练样本集来进行模型训练和分类预测。

  2. 距离度量:KNN算法通过计算样本之间的距离来衡量它们的相似性,常用的距离度量包括欧式距离、曼哈顿距离、闵可夫斯基距离等。

  3. K值:KNN算法根据最近的K个邻居来决定待分类样本的类别,K值的选择对分类效果有较大影响。

  4. 投票法:在分类问题中,KNN算法采用投票法来确定待分类样本的类别,即选择K个邻居中出现最多的类别作为待分类样本的类别。

  5. 平均法:在回归问题中,KNN算法采用平均法来预测待回归样本的输出值,即选择K个邻居的输出值的平均值作为待回归样本的输出。

  6. 权重考虑:在KNN算法中,可以给每个邻居样本赋予不同的权重,来考虑邻居样本之间的差异性对分类结果产生的影响。

  7. 打印预测结果:打印预测结果,即待预测样本的类别。

在应用KNN算法时,需要根据具体场景和数据特点选择合适的距离度量、K值、权重等参数,以达到最优的分类或回归预测效果。

二.K-近邻模型

1.三个基本要素

k 值的选择、距离度量和分类决策规则

   距离度量、k值的选择及分类决策规则是k近邻法的三个基本要素。根据选择的距离度量(如曼哈顿距离或欧氏距离),可计算测试实例与训练集中的每个实例点的距离,根据k值选择k个最近邻点,最后根据分类决策规则将测试实例分类。
    如下图,根据欧氏距离,选择k=4个离测试实例最近的训练实例(红圈处),再根据多数表决的分类决策规则,即这4个实例多数属于“-类”,可推断测试实例为“-类”。

参考链接:机器学习(二):k近邻法(kNN)

2.1 距离度量

​ 特征空间中两个实例点之间的距离是二者相似程度的反应,所以K近邻算法中一个重要的问题是计算样本之间的距离,以确定训练样本中哪些样本与测试样本更加接近。

 参考链接:机器学习(二):k近邻法(kNN)

当p=1时,称为曼哈顿距离(Manhattan distance)

当p=2时,称为欧氏距离(Euclidean distance)

如下图以二维实数向量空间(n=2)为例说明曼哈顿距离和欧氏距离的物理意义。

  参考链接:机器学习(二):k近邻法(kNN)

2.2 k值的选择

  • 较小的K值会使得分类结果对异常值更敏感,容易受到噪声的影响,可能导致过拟合。
  • 较大的K值会使得分类结果对邻近样本的影响更大,可能导致欠拟合。
  • 一般而言,K的选择要根据具体的数据集来进行调优,通过交叉验证等方法选择一个合适的K值。

选择合适的K值没有固定的规则,通常需要通过实验和交叉验证来确定最佳的K值。下面是一些常用的方法和技巧来选择K值:

  1. 经验法则:根据经验法则,可以选择较小的K值。例如,取K的平方根作为初始值,然后进行调参。

  2. 网格搜索:通过尝试不同的K值,使用交叉验证对模型进行评估,选择最佳表现的K值。可

  3. 奇数选择:在二分类问题中,通常选择奇数的K值,以避免存在平局的情况。例如,当K=2时,可能会遇到两个类别的样本数相等的情况,导致难以确定预测结果

  4. 综上一般k值选择较小的K值,选择奇数的K值在看情况而更改。

2.3 分类决策规则

  • 对于分类问题,通常使用投票法来确定待分类样本的类别。即选择K个最近邻样本中出现最多的类别作为待分类样本的预测类别。
  • 在二分类问题中,可以通过平票时的加权投票、随机选择等方式处理平票情况。
  • 对于多分类问题,可以使用一对一(One-vs-One)或一对多(One-vs-Rest)策略进行投票决策。

3.k近邻法的优缺点

优点:

  1. 简单易懂:KNN算法的原理简单,易于理解和实现。
  2. 适用性广泛:KNN算法适用于分类和回归问题,可以处理多分类和多标签问题。

缺点:

  1. 懒惰算法,对测试样本分类时的计算量大,内存开销大,对于大规模数据集,计算时间可能很长。

三,简单的具体实践

1.导入所需要的模块。(以下是我所需要的模块pandas,matplotlib.pyplot,sklearn.model_selection等等)

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA

2.生成数据集

# 生成数据集

data = []

for i in range(1, 101):

    color = random.choice(colors)

    shape = random.choice(shapes)

    fruit_class = random.choice(classes)

    data.append([i, color, shape, fruit_class])



# 将数据集转换为DataFrame并保存为CSV文件

df = pd.DataFrame(data, columns=["编号", "颜色", "形状", "类别"])

df.to_csv("fruit.csv", index=False)

3.归一化数据,生成散点图

# 2. 特征和标签准备

features = pd.get_dummies(data[["颜色", "形状"]])  # 进行独热编码

labels = data["类别"]



# 3. 特征归一化

scaler = StandardScaler()

features_scaled = scaler.fit_transform(features)




# 3. 使用PCA进行降维

pca = PCA(n_components=2)

features_pca = pca.fit_transform(features_scaled)



# 4. 可视化展示

colors = ['red', 'blue', 'green']

markers = ['o', 's', '^']

for i, label in enumerate(labels.unique()):

    filtered_features = features_pca[labels == label]

    plt.scatter(filtered_features[:, 0], filtered_features[:, 1],

                color=colors[i], marker=markers[i], label=label)

plt.xlabel('Principal Component 1')

plt.ylabel('Principal Component 2')

plt.title('Data Visualization')

plt.legend()

plt.show()

对于k近邻算法,数据集的可视化展示非常有意义。因为在k近邻算法中,预测结果是通过与目标数据点距离最近的k个邻居的标签值来确定的。而数据集的可视化可以帮助我们更好地理解不同的数据点之间的距离和相似度。

具体来说,当我们在计算目标数据点与其他点之间的距离时,可以根据绘制的散点图来判断哪些特征在距离计算中更加重要,以及哪些特征之间具有更强的相关性。这些信息可以帮助我们选择更合适的距离度量方法,并且可以通过特征选择和特征工程来提高算法的性能和精度。

4.选择距离度量方法

knn = KNeighborsClassifier(n_neighbors=9, metric='euclidean')

通过得到的散点图并结合如下得到的训练集得到的最优k值来选择最合适的距离度量方法。

5.将数据集分为训练集和验证集

X_train, X_val, y_train, y_val = train_test_split(features_scaled, labels, test_size=0.2, random_state=42)



# 7. 定义不同的k值列表,并创建一个空列表存储各个k值对应的准确率

k_values = [1, 3, 5, 7, 9]

accuracy_values = []



# 8. 针对每个k值,进行模型训练和验证

for k in k_values:

    knn = KNeighborsClassifier(n_neighbors=k)

    knn.fit(X_train, y_train)

   

    # 在验证集上进行预测

    val_predictions = knn.predict(X_val)

    accuracy = accuracy_score(y_val, val_predictions)

   

    # 存储准确率结果

    accuracy_values.append(accuracy)



# 9. 可视化不同k值对应的准确率结果

plt.plot(k_values, accuracy_values, 'o-')

plt.xlabel('k')

plt.ylabel('Accuracy')

plt.title('Accuracy vs. k')

plt.show()

得到如下图

# 10. 选择最优的k值,并在整个训练集上进行模型训练和测试

best_k = k_values[accuracy_values.index(max(accuracy_values))]

knn = KNeighborsClassifier(n_neighbors=best_k)

knn.fit(features_scaled, labels)



# 11. 预测新样本并输出预测结果

new_sample = [[0.8, 1.2, 0, 0, 1]]  # 根据实际颜色特征进行独热编码

new_sample_scaled = scaler.transform(new_sample)

predicted_label = knn.predict(new_sample_scaled)



print("最优的k值:", best_k)

print("预测结果:", predicted_label[0])



# 计算模型在训练集上的准确率

train_predictions = knn.predict(features_scaled)

train_accuracy = accuracy_score(labels, train_predictions)

print("训练集准确率:", train_accuracy)

得到最终的结果如下:

四,小结

1.KNN算法是一种简单且有效的分类算法,特别适用于小规模数据集和简单的分类任务,一般而言,较小的K值会使模型更加复杂,容易过拟合;较大的K值会使模型更加简单,容易欠拟合。

2.通过实验可知一般k值选择较小的K值,选择奇数的K值在看情况而更改。

问题体会:

1.在实现KNN算法首要确定的三要素很重要,确定选择距离度量和训练集得到最优的k都是运行knn算法的关键和必要步骤。

2.我在生成散点图的步骤中,可能由于自动生成的数据集不够准确或者相对密集导致我生成了如下

的散点图。所以在上面的步骤中选择了直接使用欧氏距离度量方法。这也是本次实验过程中最为不足的地方,需要改进。

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: knn算法(k-近邻算法)是一种分类和回归的算法,被广泛应用于模式识别、数据挖掘、图形识别等领域。其原理是根据数据本身的特征,将测试集中的每一个样本按照特征相似度进行分类。其中,k的值表示选择多少个最相似的邻居作为判断依据,通常采用欧氏距离来计算相似度。 在knn算法实现过程中,需要先将数据集分为训练集和测试集。接着,通过计算测试集中每一个样本与训练集中每一个样本的欧氏距离(或曼哈顿距离等),选择距离最近的k个邻居。最后,采用“多数表决”的方式选择样本类别,并将该类别赋给测试集中的样本。 在Python中,可以使用scikit-learn库实现knn算法。以下是一个简单的代码示例: from sklearn.neighbors import KNeighborsClassifier # 创建训练集和测试集 train_x = [[0], [1], [2], [3]] train_y = [0, 0, 1, 1] test_x = [[1.5]] # 创建knn分类器(k=2) knn = KNeighborsClassifier(n_neighbors=2) # 拟合模型 knn.fit(train_x, train_y) # 进行预测 print(knn.predict(test_x)) 以上代码中,第一行引用了scikit-learn库下的KNeighborsClassifier类,用于创建一个knn分类器。接着,分别创建了训练集和测试集,并针对训练集中的两类样本对应标签进行了标记。接下来,创建k值为2的knn分类器,并使用fit()方法对训练集进行拟合。最后,通过predict()方法进行实际的预测,并输出测试样本的分类结果。 总体来说,knn算法是一种简单易用的分类和回归算法,具有可解释性强、不受算法实现形式的特点,同时能够适应各种数据类型和特征。在Python中,采用scikit-learn库实现knn算法也非常方便。 ### 回答2: KNN算法是一种基于实例的学习方法,通过计算样本之间的距离来确定新样本的类别。KNN算法是一种简单而有效的分类方法,尤其适用于小数据集。算法原理是基于这样一种思想:样本空间中的每个样本都可以用它最近的K个邻居来代表。其中K是一个正整数,是预定的参数。当K=1时,为最近邻分类算法,即只考虑最近的一个邻居。 具体实现步骤: 1.读入数据集,并将其分为训练集和测试集。 2.对数据集进行归一化处理。 3.对每个测试实例,计算其与训练集中所有实例之间的距离。 4.按照距离的大小降序排列。 5.选取前K个距离最小的实例,得到它们所属的类别中出现次数最多的那个类别作为该测试实例的预测类别。 6.计算预测结果与实际结果的差异。 在Python实现KNN算法需要用到一些基本的库:Numpy和Scikit-learn。具体步骤如下: 1.导入Numpy库。 2.导入数据集并将其分为训练集和测试集。 3.使用Scikit-learn库中的MinMaxScaler函数进行数据归一化处理。 4.使用Scikit-learn库中的KNeighborsClassifier函数进行训练,设定参数k和metric。 5.使用Scikit-learn库中的predict函数进行预测,得到预测结果。 6.计算预测结果与实际结果的差异,得到预测准确率。 KNN算法的优点是简单易懂,精度高;缺点是计算复杂度高,对数据的大小敏感。当数据维度较高时,其计算复杂度会变得极高,而且KNN算法对数据的距离非常敏感,如果数据特征选取不当,会导致预测精度大幅下降。因此,在使用KNN算法的时候需要注意数据特征的选取和K值的选择。 ### 回答3: K近邻(k-NN)算法是最简单的基于实例的学习算法之一,它的主要思想是使用距离度量来对特征空间中的样本进行分类。KNN算法中的K代表选择邻居的数量,邻居是指在训练集中与测试数据距离最近的样本点。KNN算法的基本步骤如下: 1. 计算测试数据与所有训练数据之间的距离。 2. 根据距离度量,对距离最近的K个样本进行投票。 3. 根据投票结果,决定测试数据属于哪一类别。 KNN算法的优点是简单易用,能够处理多分类和回归问题;缺点是计算量大,对训练数据敏感,需要进行归一化处理,并需要选择合适的距离度量和K值。 Python实现KNN算法需要使用Scikit-learn或Numpy等相关库。下面给出一个简单Python代码实现,该代码实现了一个基于欧氏距离的KNN分类器: ``` import numpy as np from sklearn.neighbors import KNeighborsClassifier # 生成训练数据 X_train = np.array([[1, 2], [3, 4], [5, 6], [7, 8]]) y_train = np.array([0, 0, 1, 1]) # 创建KNN分类器,选择K=3 clf = KNeighborsClassifier(n_neighbors=3) # 训练分类器 clf.fit(X_train, y_train) # 测试数据,预测其所属类别 X_test = np.array([[2, 3], [4, 5], [6, 7]]) y_test = clf.predict(X_test) print(y_test) ``` 该代码中,通过Numpy库生成了一个4个样本点的训练数据集,其中前两个样本属于类别0,后两个样本属于类别1。同时,也生成了3个测试数据点。然后使用Scikit-learn库中的KNN分类器,在训练数据上训练模型,选择K=3。最后,对测试数据进行分类,并输出分类结果。 以上就是KNN算法的基本原理Python实现,希望对读者有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值