最简单的分类算法之一:KNN(原理解析+代码实现)[通俗易懂]

最简单的分类算法之一:KNN(原理解析+代码实现)[通俗易懂]KNN(K-NearestNeighbor),即K最邻近算法,是数据挖掘分类技术中最简单的方法之一。简单来说,它是根据“邻近”这一特征来对样本进行分类。

大家好,又见面了,我是你们的朋友全栈君。

  KNN(K- Nearest Neighbor),即K最邻近算法,是数据挖掘分类技术中最简单的方法之一。简单来说,它是根据“最邻近”这一特征来对样本进行分类。

1、大致了解KNN

  一提到KNN,很多人都想起了另外一个比较经典的聚类算法K_means,但其实,二者之间是有很多不同的,这两种算法之间的根本区别是,K_means本质上是无监督学习而KNN是监督学习,Kmeans是聚类算法而KNN是分类(或回归)算法。有关K_means的具体思想以及实现可以简单参考:机器学习之K_means(附简单手写代码)

  古语说得好,物以类聚,人以群分;近朱者赤,近墨者黑。这两句话的大概意思就是,你周围大部分朋友是什么人,那么你大概率也就是这种人,这句话其实也就是KNN算法的核心思想。

2、原理分析

  既然是近朱者赤,近墨者黑,想要衡量二者的差距,我们首先想到的是他们走得近不近,他们之间的距离大概为多少。因此,距离无论是在聚类还是分类中,都具有比较重要的意义, 这里也就拓展讲一下。
  在以下数学公式当中,我们认定训练集为: [ ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , . . . , ( x n , y n ) ] [(x_{1},y_{1}),(x_{2},y_{2}),(x_{3},y_{3}),…,(x_{n},y_{n})] [(x1,y1),(x2,y2),(x3,y3),...,(xn,yn)],其中每一个 x i x_{i} xi都具有n个特征即: x i = ( x i 1 , x i 2 , x i 3 , . . . , x i n ) x_{i}=(x_{i}^{1},x_{i}^{2},x_{i}^{3},…,x_{i}^{n}) xi=(xi1,xi2,xi3,...,xin) y i y_{i} yi是类别标签。(这里两个n纯属巧合,应该能理解)

2.1一些数学知识

(1)欧几里得距离(Euclidean Distance)
欧几里得距离是运用最广的一种计算距离的方式,我们从小在课本上接触到的也是这个东西,它衡量的是多维空间中两点之间的绝对距离,表达式如下:
在这里插入图片描述
很好理解,就不做过多解释。

(2)明可夫斯基距离(Minkowski Distance)
明可夫斯基距离是一种对多种距离的概括性描述,其表达式如下:
在这里插入图片描述
为什么说是一种概括性描述,因为当p=2时,明氏距离其实就是欧氏距离。

(3)曼哈顿距离(Manhattan distance)
当p=1时,得到绝对值距离,也称曼哈顿距离,表达式如下:

在这里插入图片描述
(4)切比雪夫距离(Chebyshev Distance)
当p->∞时,得到切比雪夫距离。表达式如下:
在这里插入图片描述

(5)马氏距离(Mahalanobis distance)
马氏距离表示点与一个分布之间的距离。 它是一种有效的计算两个未知样本集的相似度的方法。一个均值为μ,协方差矩阵为Σ的多变量向量,它的马氏距离为:
在这里插入图片描述
其中-1表示取逆矩阵,斜上方一点表示取转置,其实这个公式有点似曾相识,我们在概率生成模型中推导多维正态分布的极大似然估计时经常看到这个表达式,具体可参考:概率生成模型与朴素贝叶斯

2.2算法思想

  总得来说,KNN算法思想可以用一句话概括:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近,用上面的距离公式描述)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
  算法步骤可以大致分为如下几个步骤:

  1. 计算想要分类的点到其余点的距离
  2. 按距离升序排列,并选出前K(KNN的K)个点,也就是距离样本点最近的K个点
  3. 加权平均,得到答案

  这里大致解释一下三个步骤,比如我要预测x是属于哪一类,训练集里面有很多数据,我先算出x到其他所有点之间的距离,取前K个距离样本比较小的点,然后我们发现这K个点当中有5个属于class 1,K-5个属于class 2 。那我们就直接比较5与K-5的大小然后判断x属于哪一类吗?这显然是是不合理的。
  这里毫无意外也需要体现加权的思想。如果那五个属于class 1的点相比于另外K-5个属于class 2的点,它们距离样本点更近,根据近朱者赤,近墨者黑的原则,毫无疑问样本点x属于class 1的可能性更大,也即是说,这五个点在最终决策当中应当占据更大的比重。
  那么怎么来体现这种加权呢?我们很容易想到距离占总距离的比重,但是这样的话距离大的反而权重较大,因此我们需要用1来减去该权重,得到最终的权重。我们把K个点当中属于class 1的权重加起来,再把属于class 2的权重加起来,谁的结果大,x就属于哪一类。

3.代码实现

  数据集链接:提取码:n4lg
  数据集长这样:(截取了一部分)
在这里插入图片描述
源码:

from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import random
import pandas as pd

def knn():
    K = 8
    data=pd.read_csv(r"Prostate_Cancer.csv")
    n = len(data) // 3
    test_set = data[0:n]
    train_set = data[n:]
    train_set = np.array(train_set)
    test_set = np.array(test_set)
    A = [i for i in range(0, len(train_set))]
    B = [i for i in range(2, 10)]
    C = [i for i in range(n)]
    D = [1]
    x_train = train_set[A]
    x_train = x_train[:, B]
    y_train = train_set[A]
    y_train = y_train[:, D]
    x_test = test_set[C]
    x_test = x_test[:, B]
    y_test = test_set[C]
    y_test = y_test[:, D]
    # 训练模型
    model = KNeighborsClassifier(n_neighbors=K)
    model.fit(x_train, y_train)
    score = model.score(x_test, y_test)
    print("准确率为:", score)

if __name__=='__main__':
    knn()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146151.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vscode 插件配置_vscode常用插件有哪些

    vscode 插件配置_vscode常用插件有哪些分享一下本人目前正在使用的一套超级舒服的VsCode插件与配置(只有开发写代码时用的,没有摸鱼时用的),每一个插件的功能就不一一介绍了,直接上菜!!!settings.json文件的配置如下

    2022年9月26日
    1
  • Anchorpoint_the mythology handbook

    Anchorpoint_the mythology handbook之前做一个imageview的transform的动画,从scale(1,1)变成scale(0.3)

    2022年10月8日
    3
  • Stata Kendall 相关系数作图

    Stata Kendall 相关系数作图StataKendall相关系数作图回答Superficial.的问题,测试CSDN的markdown发帖功能如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入此帖目的有二:回答Superficial.的问题,测试CSDN的markdown发帖功能如何插入一段漂亮的代码片去博客设置页面,选择

    2022年6月17日
    26
  • 数模笔记(五):变异系数法

    数模笔记(五):变异系数法数模笔记(一):线性规划、整数规划及非线性规划数模笔记(二):层次分析法数模笔记(三):灰色系统分析方法数模笔记(四):插值与拟合一、原理若某项指标的数值差异较大,能明确区分开各被评价对象,说明该指标的分辨信息丰富,因而应给该指标以较大的权重;反之,若各个被评价对象在某项指标上的数值差异较小,那么这项指标区分各评价对象的能力较弱,因而应给该指标较小的权重。因为方差可以描述取值的离散程度,即某指标的方差反映了该指标的的分辨能力,所以可用方差定义指标的…

    2022年6月8日
    64
  • 考研数学真题用谁的_蓝桥杯编程题

    考研数学真题用谁的_蓝桥杯编程题⭐️引言⭐️大家好,我是执梗,蓝桥杯的报名快接近尾声,如果有兄弟还没报名不了解比赛,缺少视频讲解和真题资源的一定要阅读一下我的这篇蓝桥全解析——蓝桥全解析。为了帮助兄弟们更好准备比赛,我特意选取了蓝桥往年真题中许多能体现出蓝桥经典题型的题目——如暴力遍历、动态规划等等。有帮助的兄弟们一定要收藏一下,后面会陆续更新。????博客首页:执梗的博客????欢迎关注????点赞????收藏⭐️留言????❤️:热爱Java学习,期待一起交流!????作者水平很有限,如果发现错误

    2022年10月4日
    2
  • 振动与频谱分析_10频震动什么意思

    振动与频谱分析_10频震动什么意思

    2022年10月15日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号