临近算法knn(k-nearest neighbor)的计算

    科技2022-07-11  130

    想想还是把最近学的东西(AI机器学习)做一个分享吧,毕竟对知识的理解可能有错但按时成长是没有错的,本人对这些知识的认识比较粗浅还望大家多多包涵。

    从零开始机器学习

    第一章:

    临近算法knn(k-nearest neighbor)的计算

    k单位(个),意味需要预测判断的东东和离最近的几(k)个东东比较,从而判断需要预测判断的东东会是啥。 你讲的啥?好吧,我也不知道。 盗个图先 现在告诉你图里面有两种类型(红色三角和蓝色方框),让你预测一下绿色圆圈是属于红色三角还是蓝色方块 这时候我们就需要用到临近算法 当k=3的时候由图可知离绿色圆圈最近的3个有2个红色三角和一个蓝色方框(正所谓近朱者赤近墨者黑)在这种情况下我们会把圆圈判断为三角类型的,当k=5的时候方框占了3个三角有2个此时我们会让机器把圆圈判断为方框。(k一般取奇数,因为是偶数时当三角和方框个数相等时就有点为难聪明的机器了) 说到这里初学者应该有很多问题如下:

    k不同,预测结果也会有相应的差异,我们该如何选取k以保证近邻分类器的性能

    1. 将数据拆分为训练集和测试集的目的和意义

    其实我们需要提前将已知数据分为训练集和测试集,一般情况我们的训练集要比测试集多得多。 然后我们来看看训练集和测试集分别是做什么的: 顾名思义训练集用来训练出k的值(即学习过程),测试集则是用来判断训练集所得的k准不准确。 切记训练集和测试集的数据是分开放的(相当于把一个桶里的小球随机放在两个桶内),不是放在一起计算。将数据拆分为训练集和测试集也是为了防止拿学习数据再次去判断比拆分数据更容易产生误差。

    2.用训练集去计算出k 确定好训练集后我们需要选定一个k值然后一个个的选定其中一个数据计算计算在这个k值下的准确度(我们看到图一,假设我们选定一个蓝色正方形选定k=1如果离它最近的一个类别(数据)是蓝色方框那它就是正确的即分子加一),在这个k值下判断正确的所有个数做分子,整个训练集做分母。 将上个步骤取不同的k重复运算准确度最高的就是我们需要的k。一般k范围在1到训练集的完全平方根。

    3. 用测试集来判断 测试集一般用来排除特殊情况,如果嫌麻烦不用也没有太大的影响 在训练集中计算出k的值后我们再把这个值代入到测试集中取判断它的准确定是否可靠,如果可行就可以用来预测未知数据的种类了

    二.各个数据集间的距离该如何计算

    由于我们平时遇到的数据并不都是只有两种(可能是多维的)这时我们需要用到欧拉公式求解: 二维数据大家都很熟悉: 三维数据计算距离:

    多维数据计算距离 可以化简为: *在knn算法中还包含着:

    不相关属性与尺度缩放问题性能方面的考虑加权临近(对预测种类而言离它越近的已知种类对它的影响越大)移除危险的样例(对那些容易误导计算机学习的数据需要相应的移除)移除多余样例(在机器学习过程中我们的数据往往都是冗余的,所以即使删除一些训练样例也不会对分类器的性能产生影响)*

    下面是用python对鸢尾花分类代码数据集大家可以在网上搜索,不一样的地方稍微改动就好了

    from sklearn.neighbors import KNeighborsClassifier import pandas as pd #读取数据 import matplotlib.pyplot as plt#数据可视化 dataset = pd.read_csv(r'C:\Users\admin\Desktop\iris.data.csv') X = dataset.iloc[:,:3].values#取前3列的所有元素赋值给X y = dataset.iloc[:,4 ].values #取第4列的元素赋值给y # Splitting the dataset into the Training set and Test set 将数据集拆分为训练集和测试集 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 1/5, random_state = 7) #将测试集大小设为1/5将数据集拆分 k = [] p1 = [] p2 = [] #定义三个列表,k将保存knn的取值,p1将保存训练集的准确率,p2将保存测试集的准确率 j = 0 great=0 #定义一个自变量j为有序保存列表 for i in range(1,21,2): neigh = KNeighborsClassifier(n_neighbors=i,weights='distance')#knn=1,计算距离并设置相应的权重#uniform distance neigh.fit(X_train, y_train)#fit()是为计算该类处理所需的相关参数,以标准化为例 k.append(i)#将数添加进列表 p1.append(neigh.score(X_train, y_train) * 100)#对score不太明白 p2.append(neigh.score(X_test, y_test) * 100) print ("K = {:d} KNN Vali Acc-->{:.6f}%".format(i ,p2[j])) if p2[j]>great: great=p2[j] j += 1 print("{:.2f}%".format(great)) plt.xlabel('K Values',fontsize=21) plt.ylabel('Accuracy',fontsize=21) plt.title("dataset",fontsize=21) plt.xticks(fontsize=16) plt.yticks(fontsize=16) plt.plot(k, p2, ls="-", lw=3, label="Acc", marker='o') plt.legend() plt.show()

    不足之处还请指正

    Processed: 0.010, SQL: 8