一. 算法简介
1."近朱者赤,近墨者黑"是对K近邻算法最好的描述,K近邻算法是一种简单而有效的监督学习算法,用于分类和回归问题。
2.K近邻算法是一种懒惰(延迟)学习算法,它根据数据样本之间的距离来进行分类或回归预测。该算法的基本思想是:对于给定的未知样本,找到离它最近的K个已知样本,根据这K个样本的标签来进行分类或回归预测。
二.算法的原理
1.核心思想:
K近邻算法基于实例之间的相似度进行分类或回归。其核心思想是,如果一个样本在特征空间中的K个最近邻中的大多数属于某个类别,则该样本也属于该类别。在分类问题中,K近邻算法通过统计K个最近邻中各类别的数量,并选择最多的类别作为预测结果。在回归问题中,K近邻算法通过计算K个最近邻样本的平均值或加权平均值作为预测结果。
2.k值的选定:
在K近邻算法中,k值的选定是一个重要的参数,它表示用于预测新样本的最近邻居的数量。选择适当的k值对K近邻算法的性能和准确率有着重要影响。通常情况下,k值的选择应该考虑以下几个方面:
-
数据集的大小:如果数据集较小,选择较小的k值可能更合适,以避免过拟合。而对于较大的数据集,选择较大的k值可能更合适,以充分利用更多的邻居信息。
-
类别的平衡性:如果不同类别的样本数量差别较大,那么选择较大的k值可能更合适,以避免对少数类别的过度依赖。而对于类别较为平衡的数据集,选择较小的k值可能更合适。
-
噪声和异常值:如果数据集中存在噪声或异常值,选择较大的k值可以降低它们对分类结果的影响。
-
所以一般k值较小;k通常取奇数,避免产生相等占比的情况。
3.距离向量:
在K近邻算法中,距离向量是用于衡量样本之间的相似度或距离的向量。常用的距离度量方法包括欧氏距离、曼哈顿距离、闵可夫斯基距离等。
(1)欧式距离:
(2)曼哈顿距离:
三. K近邻算法的实现步骤
1.加载数据集:从文件或其他数据源中加载训练数据。
2.数据预处理:对数据进行清洗、去除异常值、归一化等处理,以便更好地应用算法。
3.计算距离:对于给定的未知样本,计算它与训练集中每个样本的距离,常用的距离度量包括欧式距离、曼哈顿距离等。
4.:选择K值:选择K的值,即选择离未知样本距离最近的K个样本。
5.进行分类或回归预测:根据选择的K个样本的标签,进行分类或回归预测。
6.评估模型:使用测试集评估模型的准确率或其他评估指标。
四.在Python中实现
1.实现
步骤1:导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
步骤2:创建示例数据集
用make_classification
函数生成一个二维的分类数据集,其中包含700个样本,3个特征,每个类别有1个相关特征
X, y = make_classification(n_samples=700, n_features=3, n_informative=1, n_redundant=0, n_clusters_per_class=1, random_state=64)
步骤3:将数据集划分为训练集和测试集,60%的训练集和40%的测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)
步骤4:设置K值为3
knn = KNeighborsClassifier(n_neighbors=3)
步骤5:进行拟合
knn.fit(X_train, y_train)
步骤6:对测试数据进行预测
y_pred = knn.predict(X_test)
步骤7:计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
步骤8:绘制散点图
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
X, y = make_classification(n_samples=700, n_features=3, n_informative=1, n_redundant=0, n_clusters_per_class=1, random_state=64)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=64)
# 选取k值
knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred) print("准确率:", accuracy)
# 绘制散点图
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False
plt.xlabel('每一周打一次篮球')
plt.ylabel('每天喝王老吉')
plt.title('Scatter Plot of Data Set')
plt.show()
2.结果:
3.遇到的问题及解决方法
问题:之前的样本选取的太少了,特征只选了两个,导致最后面的散点图准确率太少了,相似的点太少了:
解决方法:把样本(特征向量)选取的大一点,测试集由原来的30%改成40%,出来的散点图就是第一个图。
五.总结
从本次实验中,我明白了K近邻算法是一种简单而有效的分类和回归算法。K近邻算法的简单性也使得它成为一种常用的分类和回归方法之一,通过计算样本之间的相似度,K近邻算法可以对新样本进行分类或回归预测。总结起来,K近邻算法的关键是选择合适的k值和距离度量方法。合理选择这些参数,结合适当的特征选择和数据预处理,可以提高算法的准确性。