赞
踩
K近邻算法(K-Nearest Neighbors,KNN)是一种基本的机器学习算法,也是一种分类和回归方法。它的原理很简单,即根据特征相似度来进行分类或回归预测。 K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一。
在KNN算法中,首先需要给定一个训练集,其中包含了已知分类标签的样本数据。
然后,通过计算待预测样本与训练集中各个样本的特征距离,选择与待预测样本最相似的K个训练样本(即K个最近邻)
并根据这K个并据这K个最近邻样本的分类标签来对待预测样本进行分类或回归预测。
训练集:KNN算法需要已知分类标签的训练样本集来进行模型训练和分类预测。
距离度量:KNN算法通过计算样本之间的距离来衡量它们的相似性,常用的距离度量包括欧式距离、曼哈顿距离、闵可夫斯基距离等。
K值:KNN算法根据最近的K个邻居来决定待分类样本的类别,K值的选择对分类效果有较大影响。
投票法:在分类问题中,KNN算法采用投票法来确定待分类样本的类别,即选择K个邻居中出现最多的类别作为待分类样本的类别。
平均法:在回归问题中,KNN算法采用平均法来预测待回归样本的输出值,即选择K个邻居的输出值的平均值作为待回归样本的输出。
权重考虑:在KNN算法中,可以给每个邻居样本赋予不同的权重,来考虑邻居样本之间的差异性对分类结果产生的影响。
打印预测结果:打印预测结果,即待预测样本的类别。
在应用KNN算法时,需要根据具体场景和数据特点选择合适的距离度量、K值、权重等参数,以达到最优的分类或回归预测效果。
k 值的选择、距离度量和分类决策规则
距离度量、k值的选择及分类决策规则是k近邻法的三个基本要素。根据选择的距离度量(如曼哈顿距离或欧氏距离),可计算测试实例与训练集中的每个实例点的距离,根据k值选择k个最近邻点,最后根据分类决策规则将测试实例分类。
如下图,根据欧氏距离,选择k=4个离测试实例最近的训练实例(红圈处),再根据多数表决的分类决策规则,即这4个实例多数属于“-类”,可推断测试实例为“-类”。
参考链接:机器学习(二):k近邻法(kNN)
特征空间中两个实例点之间的距离是二者相似程度的反应,所以K近邻算法中一个重要的问题是计算样本之间的距离,以确定训练样本中哪些样本与测试样本更加接近。
参考链接:机器学习(二):k近邻法(kNN)
当p=1时,称为曼哈顿距离(Manhattan distance)
当p=2时,称为欧氏距离(Euclidean distance)
如下图以二维实数向量空间(n=2)为例说明曼哈顿距离和欧氏距离的物理意义。
参考链接:机器学习(二):k近邻法(kNN)
选择合适的K值没有固定的规则,通常需要通过实验和交叉验证来确定最佳的K值。下面是一些常用的方法和技巧来选择K值:
经验法则:根据经验法则,可以选择较小的K值。例如,取K的平方根作为初始值,然后进行调参。
网格搜索:通过尝试不同的K值,使用交叉验证对模型进行评估,选择最佳表现的K值。可
奇数选择:在二分类问题中,通常选择奇数的K值,以避免存在平局的情况。例如,当K=2时,可能会遇到两个类别的样本数相等的情况,导致难以确定预测结果
综上一般k值选择较小的K值,选择奇数的K值在看情况而更改。
优点:
缺点:
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.我在生成散点图的步骤中,可能由于自动生成的数据集不够准确或者相对密集导致我生成了如下
的散点图。所以在上面的步骤中选择了直接使用欧氏距离度量方法。这也是本次实验过程中最为不足的地方,需要改进。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。