python实现knn算法案例,Knn算法例题

  python实现knn算法案例,Knn算法例题

  2017年9月10日

  近邻算法

  KNN算法及其Python实例

  参加了2006年12月召开的IEEE数据挖掘国际会议(ICDM,International Conference on Data Mining),与会专家都是当时排名前10的数据挖掘算法。

  算法简洁,但在实践中相当有效。如果还不知道算法的原理,可以参考本博客之前的文章《机器学习中的kNN算法及Matlab实例》。KNN算法不仅可以用于分类,也可以用于回归,但主要用于分类。至此,本文给出了一个基于Matlab的例子。本文介绍了如何利用scikit-learn提供的函数,在Python语言中运行基于kNN的分类实例。最后,介绍了使用KNN回归的基本思想。

  1.将iris数据集导入Python进行图形显示。

  这里使用的数据也是经典的虹膜数据集,与文章《机器学习中的kNN算法及Matlab实例》一致。注意,原始数据集的每个数据点都是一个四维向量。只有两列数据,花瓣。长度和花瓣。宽度,总共150行,三种类型的Alice Ouyama各50行。

  首先,导入所有必需的包。

  将matplotlib.pyplot作为plt导入

  将numpy作为np导入

  来自sklearn进口邻居

  从sk learn导入数据

  接下来,加载数据集。

  iris=datasets.load _ iris(

  X=iris.data [:2:4] # #表示我们只取特征空间的后两个维度。

  y=虹膜.目标

  接下来,使用下面的代码以图形方式显示数据的分布。

  color=(红色、蓝色、绿色 )

  # # #分别做三组样本的散点图。

  PLT.scatter (x [ :50,0 ],x [ :50,1 ],c=color[0],marker=o ,label=setosa )

  PLT.scatter (x [ 50:100,0 ],x [ 50:100,1 ],c=color[1],marker=^ ,label=versicolor ))

  PLT.scatter (x [ 100:0 ],x [ 100:1 ],c=color[2],marker=,label=Virginica )).

  PLT.xlabel(petallength)).

  PLT.ylabel(petalwidth)).

  PLT.legend(loc=2)).

  plt.show())

  运行上面的代码,如下图所示。

  二。基于scikit-learn的kNN分类

  请记住kNN分类器的基本原理。基于邻居的分类器是一种特殊的机器学习模型,不同于SVM和感知器,它们试图从基于机器学习算法的假设集中选择最佳假设。这种基于邻居的分类器被称为基于实例的学习或非概括学习。不是试图建立一个典型的内部模型(一般内部模型),而是将训练放在需要分析或预测投票的点周围最近的点(一个邻域内或一定数量内)来完成最终的分类任务。

  Scikit-learn提供了两种不同的神经网络分类器:KNeighborsClassifier和RadiusNeighborsClassifier。前者接受用户输入的整数k,并搜索k个最近邻。后者需要浮点数R作为半径,这样才能投半径内的点。下面主要以KNeighborsClassifier为例给出kNN分类的具体实现。

  Scikit-learn提供了许多KNeighborsClassifier参数。其中最常用的是n_neighbors,指定了kNN的k值。算法参数的选项值为“ 自动”和“球_”

  如果查找最近邻的特定算法设置为“自动”,系统将根据传递给拟合方法的参数选择最合适的算法。weights参数指定每个最近邻的权重分布模式,其默认值为“统一”,这意味着所有最近邻都具有相同的权重。或者,您可以选择“距离”,这意味着重量与距离有关。公制表示距离的测量方法。默认值是“焦虑的战士”。当p=2时,‘焦虑的斗士’的距离实际上是欧几里德距离。其他参数的含义请参考参考文献[1]。

  让我们使用KNeighborsClassifier为Iris数据集构建kNN模型。请注意,这里的kNN模型并不像SVM那样从假设集中选取最佳的一个,它只是存储训练样本,因此这里建立的模型实际上是将训练样本存储在一棵树中(例如k-d-tree),得到的模型就是这样一棵树。这种结构主要是为了更快地计算NN。

  clf=邻居。KNeighborsClassifier(n _ neighbors=5,

  算法=kd_tree ,权重=uniform )

  clf.fit(X,y)

  Kneighborsclassfier(算法= KD _ tree ,leaf _ size=30,度量=焦虑的斗士,

  metric_params=None,n_jobs=1,n_neighbors=15,p=2,

  权重=统一)

  然后,使用建立的模型,预测这两个新数据点应归入哪一类。

  new_data=[[4.8,1.6],[2,0.6]]

  result=clf.predict(new_data)

  结果

  数组([1,0])

  然后做一个图形展示。

  plt.plot(新数据[0][0],新数据[0][1],c=颜色[结果[0]],标记=x ,ms=8)

  plt.plot(新数据[1][0],新数据[1][1],c=颜色[结果[1]],标记=x ,ms=8)

  plt.show()

  如下图所示,可以看出分类是正确的,新引入点的分类用颜色表示。

  第三,基于kNN的回归

  KNN不仅可以用于分类,也可以用于回归。为了便于理解,下面将以文献[2]中的例子来解释

  比如现在有一个数据,年龄=48,贷款=142000。当k=1时,我们从已知的数据集中选择最接近这组数据的一个,然后我们可以得到回归值264,即

  d=sqrt[(48-33)^2(142000-150000)^2)=8000.01 HPI=264

  如果k=3,选择三个最近的邻居并将它们平均,即

  HPI=(264 139 139)/3=180.7

  但如果上面的数据集单纯用欧氏距离,就会出现一个问题,就是贷款的价值远远高于年龄,所以它的权重会比较大。所以很多情况下,面对这种情况,我们需要对数据进行归一化处理。例如:

  这些是使用KNN回归的基本原则。感兴趣的读者还可以通过使用scikit-learn中提供的方法来体验kNN回归的应用。

  参考资料:

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: