用html5做的静态网站,做网站和做微信小程序,金华建设网站公司,WordPress 08影院源码一、引入问题#xff1a;确定绿色圆是属于红色三角形、还是蓝色正方形#xff1f;KNN的思想#xff1a;从上图中我们可以看到#xff0c;图中的数据集是良好的数据#xff0c;即都打好了label#xff0c;一类是蓝色的正方形#xff0c;一类是红色的三角形#xff0c;那…一、引入问题确定绿色圆是属于红色三角形、还是蓝色正方形KNN的思想 从上图中我们可以看到图中的数据集是良好的数据即都打好了label一类是蓝色的正方形一类是红色的三角形那个绿色的圆形是我们待分类的数据。 如果K3那么离绿色点最近的有2个红色三角形和1个蓝色的正方形这3个点投票于是绿色的这个待分类点属于红色的三角形 如果K5那么离绿色点最近的有2个红色三角形和3个蓝色的正方形这5个点投票于是绿色的这个待分类点属于蓝色的正方形 即如果一个样本在特征空间中的k个最相邻的样本中大多数属于某一个类别则该样本也属于这个类别。我们可以看到KNN本质是基于一种数据统计的方法其实很多机器学习算法也是基于数据统计的。二、KNN算法1.介绍 KNN即K-Nearest Neighbor是一种memory-based learning也叫instance-based learning属于lazy learning。即它没有明显的前期训练过程而是程序开始运行时把数据集加载到内存后不需要进行训练就可以开始分类了。 KNN也是一种监督学习算法通过计算新数据与训练数据特征值之间的距离然后选取K(K1)个距离最近的邻居进行分类判(投票法)或者回归。若K1新数据被简单分配给其近邻的类。2.步骤1)计算测试数据与各个训练数据之间的距离(计算距离的方式前文讲k-means时说过不清楚的可以去查看以下➡传送门)2)按照距离的递增关系进行排序3)选取距离最小的K个点K值是由自己来确定的4)确定前K个点所在类别的出现频率5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。说明对于步骤5的预测分类有以下两种方法多数表决法多数表决法类似于投票的过程也就是在 K 个邻居中选择类别最多的种类作为测试样本的类别。加权表决法根据距离的远近对近邻的投票进行加权距离越近则权重越大通过权重计算结果最大值的类为测试样本的类别。特点非参数统计方法不需要引入参数K的选择K 1时将待分类样本划入与其最接近的样本的类。K |X|时仅根据训练样本进行频率统计将待分类样本划入最多的类。K需要合理选择太小容易受干扰太大增加计算复杂性。算法的复杂度维度灾难当维数增加时所需的训练样本数急剧增加一般采用降维处理。三、算法优缺点优点简单、有效。重新训练的代价较低(类别体系的变化和训练集的变化在Web环境和电子商务应用中是很常见的)。计算时间和空间线性于训练集的规模(在一些场合不算太大)。由于KNN方法主要靠周围有限的邻近的样本而不是靠判别类域的方法来确定所属类别的因此对于类域的交叉或重叠较多的待分样本集来说KNN方法较其他方法更为适合。该算法比较适用于样本容量比较大的类域的自动分类而那些样本容量较小的类域采用这种算法比较容易产生误分。缺点KNN算法是懒散学习方法(lazy learning)而一些积极学习的算法要快很多。需要存储全部的训练样本输出的可解释性不强例如决策树的可解释性较强。该算法在分类时有个主要的不足是当样本不平衡时如一个类的样本容量很大而其他类样本容量很小时有可能导致当输入一个新样本时该样本的K个邻居中大容量类的样本占多数。该算法只计算最近的邻居样本某一类的样本数量很大那么或者这类样本并不接近目标样本或者这类样本很靠近目标样本。无论怎样数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。计算量较大。目前常用的解决方法是事先对已知样本点进行剪辑事先去除对分类作用不大的样本。四、KNN与K-means的区别 废话不多说咱直接上图相似点 虽然两者有很大且别但两者也有共同之处。都包含了一个过程给定一个点在数据集找离它最近的点即都用到了NN(Nearest Neighbor)算法。五、python实例实现 下面引入一个实例通过python代码具体看下KNN算法的流程。from numpy import *import operatordataSet array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])labels [A,A,B,B]def classify0(inX,dataSet,labels,k): #求出样本集的行数也就是labels标签的数目 dataSetSize dataSet.shape[0] #构造输入值和样本集的差值矩阵 diffMat tile(inX,(dataSetSize,1)) - dataSet #计算欧式距离 sqDiffMat diffMat**2 sqDistances sqDiffMat.sum(axis1) distances sqDistances**0.5 #求距离从小到大排序的序号 sortedDistIndicies distances.argsort() #对距离最小的k个点统计对应的样本标签 classCount {} for i in range(k): #取第i1邻近的样本对应的类别标签 voteIlabel labels[sortedDistIndicies[i]] #以标签为key标签出现的次数为value将统计到的标签及出现次数写进字典 classCount[voteIlabel] classCount.get(voteIlabel,0) 1 #对字典按value从大到小排序 sortedClassCount sorted(classCount.items(),keyoperator.itemgetter(1),reverseTrue) #返回排序后字典中最大value对应的key return sortedClassCount[0][0]if __name__ __main__: print(classify0([1.1,0],dataSet,labels,3))私信我:“学习”可免费领取更多相关学习资料 (免费的哦)。