精华内容
下载资源
问答
  • 贝叶斯分类算法

    千次阅读 多人点赞 2018-07-31 16:09:12
    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到...

    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到的朴素贝叶斯分类算法,希望有利于他人理解。

     

    1  分类问题综述

     对于分类问题,其实谁都不会陌生,日常生活中我们每天都进行着分类过程。例如,当你看到一个人,你的脑子下意识判断他是学生还是社会上的人;你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱”之类的话,其实这就是一种分类操作。

     

    既然是贝叶斯分类算法,那么分类的数学描述又是什么呢?

     

    从数学角度来说,分类问题可做如下定义:已知集合,确定映射规则y = f(x),使得任意有且仅有一个,使得成立。

     

    其中C叫做类别集合,其中每一个元素是一个类别,而I叫做项集合(特征集合),其中每一个元素是一个待分类项,f叫做分类器。分类算法的任务就是构造分类器f。

     

    分类算法的内容是要求给定特征,让我们得出类别,这也是所有分类问题的关键。那么如何由指定特征,得到我们最终的类别,也是我们下面要讲的,每一个不同的分类算法,对应着不同的核心思想。

     

    本篇文章,我会用一个具体实例,对朴素贝叶斯算法几乎所有的重要知识点进行讲解。

     

    2  朴素贝叶斯分类

    那么既然是朴素贝叶斯分类算法,它的核心算法又是什么呢?

    是下面这个贝叶斯公式:

     

     

    换个表达形式就会明朗很多,如下:

     

     

    我们最终求的p(类别|特征)即可!就相当于完成了我们的任务。

     

    3  例题分析

    下面我先给出例子问题。

     

    给定数据如下:

     

     

    现在给我们的问题是,如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?

     

    这是一个典型的分类问题,转为数学问题就是比较p(嫁|(不帅、性格不好、身高矮、不上进))与p(不嫁|(不帅、性格不好、身高矮、不上进))的概率,谁的概率大,我就能给出嫁或者不嫁的答案!

    这里我们联系到朴素贝叶斯公式:

     

     

    我们需要求p(嫁|(不帅、性格不好、身高矮、不上进),这是我们不知道的,但是通过朴素贝叶斯公式可以转化为好求的三个量.

     

    p(不帅、性格不好、身高矮、不上进|嫁)、p(不帅、性格不好、身高矮、不上进)、p(嫁)(至于为什么能求,后面会讲,那么就太好了,将待求的量转化为其它可求的值,这就相当于解决了我们的问题!)

     

    4  朴素贝叶斯算法的朴素一词解释

    那么这三个量是如何求得?

     

    是根据已知训练数据统计得来,下面详细给出该例子的求解过程。

    回忆一下我们要求的公式如下:

     

     

    那么我只要求得p(不帅、性格不好、身高矮、不上进|嫁)、p(不帅、性格不好、身高矮、不上进)、p(嫁)即可,好的,下面我分别求出这几个概率,最后一比,就得到最终结果。

     

    p(不帅、性格不好、身高矮、不上进|嫁) = p(不帅|嫁)*p(性格不好|嫁)*p(身高矮|嫁)*p(不上进|嫁),那么我就要分别统计后面几个概率,也就得到了左边的概率!

     

    等等,为什么这个成立呢?学过概率论的同学可能有感觉了,这个等式成立的条件需要特征之间相互独立吧!

     

    对的!这也就是为什么朴素贝叶斯分类有朴素一词的来源,朴素贝叶斯算法是假设各个特征之间相互独立,那么这个等式就成立了!

     

    但是为什么需要假设特征之间相互独立呢?

     

     

    1、我们这么想,假如没有这个假设,那么我们对右边这些概率的估计其实是不可做的,这么说,我们这个例子有4个特征,其中帅包括{帅,不帅},性格包括{不好,好,爆好},身高包括{高,矮,中},上进包括{不上进,上进},那么四个特征的联合概率分布总共是4维空间,总个数为2*3*3*2=36个。

     

    36个,计算机扫描统计还可以,但是现实生活中,往往有非常多的特征,每一个特征的取值也是非常之多,那么通过统计来估计后面概率的值,变得几乎不可做,这也是为什么需要假设特征之间独立的原因。

     

    2、假如我们没有假设特征之间相互独立,那么我们统计的时候,就需要在整个特征空间中去找,比如统计p(不帅、性格不好、身高矮、不上进|嫁),

     

    我们就需要在嫁的条件下,去找四种特征全满足分别是不帅,性格不好,身高矮,不上进的人的个数,这样的话,由于数据的稀疏性,很容易统计到0的情况。 这样是不合适的。

     

    根据上面俩个原因,朴素贝叶斯法对条件概率分布做了条件独立性的假设,由于这是一个较强的假设,朴素贝叶斯也由此得名!这一假设使得朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。

     

    好的,上面我解释了为什么可以拆成分开连乘形式。那么下面我们就开始求解!

     

    我们将上面公式整理一下如下:

     

     

    下面我将一个一个的进行统计计算(在数据量很大的时候,根据中心极限定理,频率是等于概率的,这里只是一个例子,所以我就进行统计即可)。

     

    p(嫁)=?

    首先我们整理训练数据中,嫁的样本数如下:

     

    则 p(嫁) = 6/12(总样本数) = 1/2

     

    p(不帅|嫁)=?统计满足样本数如下:

     

    则p(不帅|嫁) = 3/6 = 1/2 在嫁的条件下,看不帅有多少

     

    p(性格不好|嫁)= ?统计满足样本数如下:

     

    则p(性格不好|嫁)= 1/6

     

    p(矮|嫁) = ?统计满足样本数如下:

     

    则p(矮|嫁) = 1/6

     

    p(不上进|嫁) = ?统计满足样本数如下:

     

    则p(不上进|嫁) = 1/6

     

    下面开始求分母,p(不帅),p(性格不好),p(矮),p(不上进)

    统计样本如下:

     

     

    不帅统计如上红色所示,占4个,那么p(不帅) = 4/12 = 1/3

     

     

    性格不好统计如上红色所示,占4个,那么p(性格不好) = 4/12 = 1/3

     

     

    身高矮统计如上红色所示,占7个,那么p(身高矮) = 7/12

     

     

    不上进统计如上红色所示,占4个,那么p(不上进) = 4/12 = 1/3

     

    到这里,要求p(不帅、性格不好、身高矮、不上进|嫁)的所需项全部求出来了,下面我带入进去即可,

     

    = (1/2*1/6*1/6*1/6*1/2)/(1/3*1/3*7/12*1/3)

     

    下面我们根据同样的方法来求p(不嫁|不帅,性格不好,身高矮,不上进),完全一样的做法,为了方便理解,我这里也走一遍帮助理解。首先公式如下:

     

     

    下面我也一个一个来进行统计计算,这里与上面公式中,分母是一样的,于是我们分母不需要重新统计计算!

     

    p(不嫁)=?根据统计计算如下(红色为满足条件):

     

     

    则p(不嫁)=6/12 = 1/2

     

    p(不帅|不嫁) = ?统计满足条件的样本如下(红色为满足条件):

     

     

    则p(不帅|不嫁) = 1/6

     

    p(性格不好|不嫁) = ?据统计计算如下(红色为满足条件):


    则p(性格不好|不嫁) =3/6 = 1/2

     

    p(矮|不嫁) = ?据统计计算如下(红色为满足条件):

     

    则p(矮|不嫁) = 6/6 = 1

     

    p(不上进|不嫁) = ?据统计计算如下(红色为满足条件):

    则p(不上进|不嫁) = 3/6 = 1/2

     

    那么根据公式:

     

    p (不嫁|不帅、性格不好、身高矮、不上进) = ((1/6*1/2*1*1/2)*1/2)/(1/3*1/3*7/12*1/3)

    很显然(1/6*1/2*1*1/2) > (1/2*1/6*1/6*1/6*1/2)

     

    于是有p (不嫁|不帅、性格不好、身高矮、不上进)>p (嫁|不帅、性格不好、身高矮、不上进)

     

    所以我们根据朴素贝叶斯算法可以给这个女生答案,是不嫁!!!!

     

    5  朴素贝叶斯分类的优缺点

    优点:

    (1) 算法逻辑简单,易于实现(算法思路很简单,只要使用贝叶斯公式转化医学即可!)

    (2)分类过程中时空开销小(假设特征相互独立,只会涉及到二维存储)

     

    缺点:

     

    理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。

     

    而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

     

    整个例子详细的讲解了朴素贝叶斯算法的分类过程,希望对大家的理解有帮助~

     

    参考:李航博士《统计学习方法》

    算法杂货铺--分类算法之朴素贝叶斯分类(Naive Bayesian classification)

     

    致谢:德川,皓宇,继豪,施琦

    原文地址:https://blog.csdn.net/amds123/article/details/70173402

    展开全文
  • 带你搞懂朴素贝叶斯分类算法

    万次阅读 多人点赞 2017-04-14 16:19:33
    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到...

    最新人工智能论文:http://paperreading.club

    带你搞懂朴素贝叶斯分类算

    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到的朴素贝叶斯分类算法,希望有利于他人理解。

     

    1  分类问题综述

     对于分类问题,其实谁都不会陌生,日常生活中我们每天都进行着分类过程。例如,当你看到一个人,你的脑子下意识判断他是学生还是社会上的人;你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱”之类的话,其实这就是一种分类操作。

     

    既然是贝叶斯分类算法,那么分类的数学描述又是什么呢?

     

    从数学角度来说,分类问题可做如下定义:已知集合,确定映射规则y = f(x),使得任意有且仅有一个,使得成立。

     

    其中C叫做类别集合,其中每一个元素是一个类别,而I叫做项集合(特征集合),其中每一个元素是一个待分类项,f叫做分类器。分类算法的任务就是构造分类器f。

     

    分类算法的内容是要求给定特征,让我们得出类别,这也是所有分类问题的关键。那么如何由指定特征,得到我们最终的类别,也是我们下面要讲的,每一个不同的分类算法,对应着不同的核心思想。

     

    本篇文章,我会用一个具体实例,对朴素贝叶斯算法几乎所有的重要知识点进行讲解。

     

    2  朴素贝叶斯分类

    那么既然是朴素贝叶斯分类算法,它的核心算法又是什么呢?

    是下面这个贝叶斯公式:

     

     

    换个表达形式就会明朗很多,如下:

     

     

    我们最终求的p(类别|特征)即可!就相当于完成了我们的任务。

     

    3  例题分析

    下面我先给出例子问题。

     

    给定数据如下:

     

     

    现在给我们的问题是,如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是还是不嫁

     

    这是一个典型的分类问题,转为数学问题就是比较p(嫁|(不帅、性格不好、身高矮、不上进))与p(不嫁|(不帅、性格不好、身高矮、不上进))的概率,谁的概率大,我就能给出嫁或者不嫁的答案!

    这里我们联系到朴素贝叶斯公式:

     

     

    我们需要求p(嫁|(不帅、性格不好、身高矮、不上进),这是我们不知道的,但是通过朴素贝叶斯公式可以转化为好求的三个量.

     

    p(不帅、性格不好、身高矮、不上进|嫁)、p(不帅、性格不好、身高矮、不上进)、p(嫁)(至于为什么能求,后面会讲,那么就太好了,将待求的量转化为其它可求的值,这就相当于解决了我们的问题!

     

    4  朴素贝叶斯算法的朴素一词解释

    那么这三个量是如何求得?

     

    是根据已知训练数据统计得来,下面详细给出该例子的求解过程。

    回忆一下我们要求的公式如下:

     

     

    那么我只要求得p(不帅、性格不好、身高矮、不上进|嫁)、p(不帅、性格不好、身高矮、不上进)、p(嫁)即可,好的,下面我分别求出这几个概率,最后一比,就得到最终结果。

     

    p(不帅、性格不好、身高矮、不上进|嫁) = p(不帅|嫁)*p(性格不好|嫁)*p(身高矮|嫁)*p(不上进|嫁),那么我就要分别统计后面几个概率,也就得到了左边的概率!

     

    等等,为什么这个成立呢?学过概率论的同学可能有感觉了,这个等式成立的条件需要特征之间相互独立吧!

     

    对的!这也就是为什么朴素贝叶斯分类有朴素一词的来源,朴素贝叶斯算法是假设各个特征之间相互独立,那么这个等式就成立了!

     

    但是为什么需要假设特征之间相互独立呢?

     

     

    1、我们这么想,假如没有这个假设,那么我们对右边这些概率的估计其实是不可做的,这么说,我们这个例子有4个特征,其中帅包括{帅,不帅},性格包括{不好,好,爆好},身高包括{高,矮,中},上进包括{不上进,上进},那么四个特征的联合概率分布总共是4维空间,总个数为2*3*3*2=36个。

     

    36个,计算机扫描统计还可以,但是现实生活中,往往有非常多的特征,每一个特征的取值也是非常之多,那么通过统计来估计后面概率的值,变得几乎不可做,这也是为什么需要假设特征之间独立的原因。

     

    2、假如我们没有假设特征之间相互独立,那么我们统计的时候,就需要在整个特征空间中去找,比如统计p(不帅、性格不好、身高矮、不上进|嫁),

     

    我们就需要在嫁的条件下,去找四种特征全满足分别是不帅,性格不好,身高矮,不上进的人的个数,这样的话,由于数据的稀疏性,很容易统计到0的情况。 这样是不合适的。

     

    根据上面俩个原因,朴素贝叶斯法对条件概率分布做了条件独立性的假设,由于这是一个较强的假设,朴素贝叶斯也由此得名!这一假设使得朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。

     

    好的,上面我解释了为什么可以拆成分开连乘形式。那么下面我们就开始求解!

     

    我们将上面公式整理一下如下:

     

     

    下面我将一个一个的进行统计计算(在数据量很大的时候,根据中心极限定理,频率是等于概率的,这里只是一个例子,所以我就进行统计即可)。

     

    p(嫁)=?

    首先我们整理训练数据中,嫁的样本数如下:

     

    则 p(嫁) = 6/12(总样本数) = 1/2

     

    p(不帅|嫁)=?统计满足样本数如下:

     

    则p(不帅|嫁) = 3/6 = 1/2 在嫁的条件下,看不帅有多少

     

    p(性格不好|嫁)= ?统计满足样本数如下:

     

    则p(性格不好|嫁)= 1/6

     

    p(矮|嫁) = ?统计满足样本数如下:

     

    则p(矮|嫁) = 1/6

     

    p(不上进|嫁) = ?统计满足样本数如下:

     

    则p(不上进|嫁) = 1/6

     

    下面开始求分母,p(不帅),p(性格不好),p(矮),p(不上进)

    统计样本如下:

     

     

    不帅统计如上红色所示,占4个,那么p(不帅) = 4/12 = 1/3

     

     

    性格不好统计如上红色所示,占4个,那么p(性格不好) = 4/12 = 1/3

     

     

    身高矮统计如上红色所示,占7个,那么p(身高矮) = 7/12

     

     

    不上进统计如上红色所示,占4个,那么p(不上进) = 4/12 = 1/3

     

    到这里,要求p(不帅、性格不好、身高矮、不上进|嫁)的所需项全部求出来了,下面我带入进去即可,

     

    = (1/2*1/6*1/6*1/6*1/2)/(1/3*1/3*7/12*1/3)

     

    下面我们根据同样的方法来求p(不嫁|不帅,性格不好,身高矮,不上进),完全一样的做法,为了方便理解,我这里也走一遍帮助理解。首先公式如下:

     

     

    下面我也一个一个来进行统计计算,这里与上面公式中,分母是一样的,于是我们分母不需要重新统计计算!

     

    p(不嫁)=?根据统计计算如下(红色为满足条件):

     

     

    则p(不嫁)=6/12 = 1/2

     

    p(不帅|不嫁) = ?统计满足条件的样本如下(红色为满足条件):

     

     

    则p(不帅|不嫁) = 1/6

     

    p(性格不好|不嫁) = ?据统计计算如下(红色为满足条件):


    则p(性格不好|不嫁) =3/6 = 1/2

     

    p(矮|不嫁) = ?据统计计算如下(红色为满足条件):

     

    则p(矮|不嫁) = 6/6 = 1

     

    p(不上进|不嫁) = ?据统计计算如下(红色为满足条件):

    则p(不上进|不嫁) = 3/6 = 1/2

     

    那么根据公式:

     

    p (不嫁|不帅、性格不好、身高矮、不上进) = ((1/6*1/2*1*1/2)*1/2)/(1/3*1/3*7/12*1/3)

    很显然(1/6*1/2*1*1/2) > (1/2*1/6*1/6*1/6*1/2)

     

    于是有p (不嫁|不帅、性格不好、身高矮、不上进)>p (嫁|不帅、性格不好、身高矮、不上进)

     

    所以我们根据朴素贝叶斯算法可以给这个女生答案,是不嫁!!!!

     

    5  朴素贝叶斯分类的优缺点

    优点:

    (1) 算法逻辑简单,易于实现(算法思路很简单,只要使用贝叶斯公式转化医学即可!

    (2)分类过程中时空开销小(假设特征相互独立,只会涉及到二维存储

     

    缺点:

     

    理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。

     

    而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

     

    整个例子详细的讲解了朴素贝叶斯算法的分类过程,希望对大家的理解有帮助~

     

    参考:李航博士《统计学习方法》

    算法杂货铺--分类算法之朴素贝叶斯分类(Naive Bayesian classification)

     

    致谢:德川,皓宇,继豪,施琦


    原文地址:https://mp.weixin.qq.com/s?__biz=MzI4MDYzNzg4Mw==&mid=2247483819&idx=1&sn=7f1859c0a00248a4c658fa65f846f341&chksm=ebb4397fdcc3b06933816770b928355eb9119c4c80a1148b92a42dc3c08de5098fd6f278e61e#rd

    展开全文
  • KNN分类算法详解

    千次阅读 2020-05-22 20:46:39
    KNN 可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一。注意:KNN 算法是有监督学习中的分类算法,它看起来和另一个机器学习算法 K-means 有点像(K-means 是无监督学习算法),但却是有本质区别的...

    参考:https://www.cnblogs.com/listenfwind/p/10311496.html
    https://www.cnblogs.com/listenfwind/p/10685192.html

    1. 概述

    • KNN 可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一。注意:KNN 算法是有监督学习中的分类算法,它看起来和另一个机器学习算法 K-means 有点像(K-means 是无监督学习算法),但却是有本质区别的。

    2. 核心思想

    • KNN 的全称是 K Nearest Neighbors,意思是 K 个最近的邻居。从这个名字我们就能看出一些 KNN 算法的蛛丝马迹了。K 个最近邻居,毫无疑问,K 的取值肯定是至关重要的,那么最近的邻居又是怎么回事呢?其实,KNN 的原理就是当预测一个新的值 x 的时候,根据它距离最近的 K 个点是什么类别来判断 x 属于哪个类别。听起来有点绕,还是看看图吧。
      在这里插入图片描述
    • 图中绿色的点就是我们要预测的那个点,假设 K=3。那么 KNN 算法就会找到与它距离最近的三个点(这里用圆圈把它圈起来了),看看哪种类别多一些,比如这个例子中是蓝色三角形多一些,新来的绿色点就归类到蓝三角了。
      在这里插入图片描述
    • 但是,当 K=5 的时候,判定就变成不一样了。这次变成红圆多一些,所以新来的绿点被归类成红圆。从这个例子中,我们就能看得出 K 的取值是很重要的。
      明白了大概原理后,我们就来说一说细节的东西吧,主要有两个,K 值的选取和点距离的计算。

    2.1 距离计算

    • 要度量空间中点距离的话,有好几种度量方式,比如常见的曼哈顿距离计算、欧式距离计算等等。不过通常 KNN 算法中使用的是欧式距离。这里只是简单说一下,拿二维平面为例,二维空间两个点的欧式距离计算公式如下:
      在这里插入图片描述
      这个高中应该就有接触到的了,其实就是计算(x1,y1)和(x2,y2)的距离。拓展到多维空间,则公式变成这样:
      在这里插入图片描述
      这样我们就明白了如何计算距离。KNN 算法最简单粗暴的就是将预测点与所有点距离进行计算,然后保存并排序,选出前面 K 个值看看哪些类别比较多。但其实也可以通过一些数据结构来辅助,比如最大堆,这里就不多做介绍,有兴趣可以百度最大堆相关数据结构的知识。

    2.2 K值选择

    • 通过上面那张图我们知道 K 的取值比较重要,那么该如何确定 K 取多少值好呢?答案是通过交叉验证(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的 K 值开始,不断增加 K 的值,然后计算验证集合的方差,最终找到一个比较合适的 K 值。

    • 通过交叉验证计算方差后你大致会得到下面这样的图:
      在这里插入图片描述
      这个图其实很好理解,当你增大 K 的时候,一般错误率会先降低,因为有周围更多的样本可以借鉴了,分类效果会变好。但注意,和 K-means 不一样,当 K 值更大的时候,错误率会更高。这也很好理解,比如说你一共就35个样本,当你 K 增大到30的时候,KNN 基本上就没意义了。

    • 所以选择 K 点的时候可以选择一个较大的临界 K 点,当它继续增大或减小的时候,错误率都会上升,比如图中的 K=10。

    3. 算法实现

    3.1 Sklearn KNN参数概述

    • 要使用 Sklearn KNN 算法进行分类,我们需要先了解 Sklearn KNN 算法的一些基本参数:
    def KNeighborsClassifier(n_neighbors = 5,
                           weights='uniform',
                           algorithm = '',
                           leaf_size = '30',
                           p = 2,
                           metric = 'minkowski',
                           metric_params = None,
                           n_jobs = None
                           )
    

    其中:

    • n_neighbors:这个值就是指 KNN 中的 “K”了。前面说到过,通过调整 K 值,算法会有不同的效果。
    • weights(权重):最普遍的 KNN 算法无论距离如何,权重都一样,但有时候我们想搞点特殊化,比如距离更近的点让它更加重要。这时候就需要 weight 这个参数了,这个参数有三个可选参数的值,决定了如何分配权重。参数选项如下:
      * ‘uniform’:不管远近权重都一样,就是最普通的 KNN 算法的形式。
      * ‘distance’:权重和距离成反比,距离预测目标越近具有越高的权重。
      * 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。
    • algorithm:在 Sklearn 中,要构建 KNN 模型有三种构建方式:
      1. 暴力法,就是直接计算距离存储比较的那种方式。
      2. 使用 Kd 树构建 KNN 模型。
      3. 使用球树构建。
      其中暴力法适合数据较小的方式,否则效率会比较低。如果数据量比较大一般会选择用 Kd 树构建 KNN 模型,而当 Kd 树也比较慢的时候,则可以试试球树来构建 KNN。参数选项如下:
      * ‘brute’ :蛮力实现;
      * ‘kd_tree’:KD 树实现 KNN;
      * ‘ball_tree’:球树实现 KNN ;
      * ‘auto’: 默认参数,自动选择合适的方法构建模型。
      不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 ‘brute’。
    • leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的。当使用 Kd 树或球树,它就是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,否则速度过慢不说,还容易过拟合。
    • p:和 metric 结合使用,当 metric 参数是 “minkowski” 的时候,p=1 为曼哈顿距离, p=2 为欧式距离。默认为p=2。
    • metric:指定距离度量方法,一般都是使用欧式距离。
      * ‘euclidean’ :欧式距离;
      * ‘manhattan’:曼哈顿距离;
      * ‘chebyshev’:切比雪夫距离;
      * ‘minkowski’: 闵可夫斯基距离,默认参数。
    • n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。

    3.2 KNN代码实例

    • KNN 算法算是机器学习里面最简单的算法之一了,我们来看 Sklearn 官方给出的例子是怎样使用KNN 的。

    • 数据集使用的是著名的鸢尾花数据集,用 KNN 来对它做分类。我们先看看鸢尾花长的啥样:
      在这里插入图片描述
      上面这个就是鸢尾花了,这个鸢尾花数据集主要包含了鸢尾花的花萼长度、花萼宽度、花瓣长度、花瓣宽度4个属性(特征),以及鸢尾花卉属于『Setosa、Versicolour、Virginica』三个种类中的哪一类(这三种都长什么样我也不知道)。

    • 在使用 KNN 算法之前,我们要先决定 K 的值是多少。要选出最优的 K 值,可以使用 Sklearn 中的交叉验证方法,代码如下:

    from sklearn.datasets import load_iris
    from sklearn.model_selection  import cross_val_score
    import matplotlib.pyplot as plt
    from sklearn.neighbors import KNeighborsClassifier
    
    #读取鸢尾花数据集
    iris = load_iris()
    x = iris.data
    y = iris.target
    k_range = range(1, 31)
    k_error = []
    #循环,取k=1到k=31,查看误差效果
    for k in k_range:
        knn = KNeighborsClassifier(n_neighbors=k)
        #cv参数决定数据集划分比例,这里是按照5:1划分训练集和测试集
        scores = cross_val_score(knn, x, y, cv=6, scoring='accuracy')
        k_error.append(1 - scores.mean())
    
    #画图,x轴为k值,y值为误差值
    plt.plot(k_range, k_error)
    plt.xlabel('Value of K for KNN')
    plt.ylabel('Error')
    plt.show()
    

    运行后,我们可以得到下面这样的图:
    在这里插入图片描述
    有了这张图,我们就能明显看出 K 值取多少的时候误差最小,这里明显是 K=11 最好。当然在实际问题中,如果数据集比较大,那为减少训练时间,K 的取值范围可以缩小。

    • 有了 K 值我们就能运行 KNN 算法了,具体代码如下:
    import matplotlib.pyplot as plt
    from numpy import *
    from matplotlib.colors import ListedColormap
    from sklearn import neighbors, datasets
    
    n_neighbors = 11
    
     # 导入一些要玩的数据
    iris = datasets.load_iris()
    x = iris.data[:, :2]  # 我们只采用前两个feature,方便画图在二维平面显示
    y = iris.target
    
    h = .02  # 网格中的步长
    
     # 创建彩色的图
    cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
    cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
    
    #weights是KNN模型中的一个参数,上述参数介绍中有介绍,这里绘制两种权重参数下KNN的效果图
    for weights in ['uniform', 'distance']:
        # 创建了一个knn分类器的实例,并拟合数据
        clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
        clf.fit(x, y)
    
        # 绘制决策边界,为此,我们将为每个分配一个颜色
        # 来绘制网格中的点 [x_min, x_max]x[y_min, y_max].
        x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1
        y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1
        xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                             np.arange(y_min, y_max, h))
        Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    
        # 将结果放入一个彩色图中
        Z = Z.reshape(xx.shape)
        plt.figure()
        plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
    
        # 绘制训练点
        plt.scatter(x[:, 0], x[:, 1], c=y, cmap=cmap_bold)
        plt.xlim(xx.min(), xx.max())
        plt.ylim(yy.min(), yy.max())
        plt.title("3-Class classification (k = %i, weights = '%s')" % (n_neighbors, weights))
    
    plt.show()
    

    4. 算法特点

    • KNN是一种非参的、惰性的算法模型。什么是非参,什么是惰性呢?

    • 非参的意思并不是说这个算法不需要参数,而是意味着这个模型不会对数据做出任何的假设,与之相对的是线性回归(我们总会假设线性回归是一条直线)。也就是说 KNN 建立的模型结构是根据数据来决定的,这也比较符合现实的情况,毕竟在现实中的情况往往与理论上的假设是不相符的。

    • 惰性又是什么意思呢?想想看,同样是分类算法,逻辑回归需要先对数据进行大量训练(tranning),最后才会得到一个算法模型。而 KNN 算法却不需要,它没有明确的训练数据的过程,或者说这个过程很快。

    5. 算法优缺点

    5.1优点

    1. 简单易用。相比其他算法,KNN 算是比较简洁明了的算法,即使没有很高的数学基础也能搞清楚它的原理。
    2. 模型训练时间快,上面说到 KNN 算法是惰性的,这里也就不再过多讲述。
    3. 预测效果好。
    4. 对异常值不敏感。

    5.2 缺点

    1. 对内存要求较高,因为该算法存储了所有训练数据。
    2. 预测阶段可能很慢。
    3. 对不相关的功能和数据规模敏感。

    6. KNN 和 K-means比较

    • 前面说到过,KNN 和 K-means 听起来有些像,但本质是有区别的,这里我们就顺便说一下两者的异同吧。

    6.1 相同点:

    1. K 值都是重点。
    2. 都需要计算平面中点的距离。

    6.2 相异点:

    • KNN 和 K-means 的核心都是通过计算空间中点的距离来实现目的,只是他们的目的是不同的。KNN 的最终目的是分类,而 K-means 的目的是给所有距离相近的点分配一个类别,也就是聚类。

    • 简单说,就是画一个圈,KNN 是让进来圈子里的人变成自己人,K-means 是让原本在圈内的人归成一类人。

    • 至于什么时候应该选择使用 KNN 算法,Sklearn 的这张图给了我们一个答案:
      在这里插入图片描述

    • 简单来说,就是当需要使用分类算法,且数据比较大的时候就可以尝试使用 KNN 算法进行分类了。

    补充:

    • Scikit-learn (Sklearn) 是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。当我们面临机器学习问题时,便可根据上图来选择相应的方法。Sklearn 具有以下特点:
    1. 简单高效的数据挖掘和数据分析工具;
    2. 让每个人能够在复杂环境中重复使用;
    3. 建立NumPy、Scipy、MatPlotLib 之上。
    展开全文
  • K近邻分类算法

    千次阅读 2018-09-19 15:59:25
    K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个...

    K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
    下面以比较著名的鸾尾花(Iris)数据集举例,讲解K近邻算法
    首先我们先导入数据

    from sklearn.datasets import load_iris
    iris = load_iris()
    print(iris.data.shape)
    print(iris.data)
    

    在这里插入图片描述
    可以看到Iris数据集共有150朵鸾尾花的样本,因为没有测试数据,所以我们随机采用其中75%的数据作为训练数据,采用剩余的25%的数据作为测试数据
    下面对Iris数据集进行分割

    from sklearn.cross_validation import train_test_split
    X_train,X_test,Y_train,Y_test = train_test_split(iris.data,iris.target,test_size=0.25,random_state=33)
    

    分割完成后,到了训练部分,这里我们使用K近邻分类器对鸾尾花的数据进行类别预测

    from sklearn.preprocessing import StandardScaler
    from sklearn.neighbors import KNeighborsClassifier
    
    ss = StandardScaler()
    X_train = ss.fit_transform(X_train)
    X_test = ss.transform(X_test)
    
    knc = KNeighborsClassifier()
    knc.fit(X_train,Y_train)
    Y_predict = knc.predict(X_test)
    

    将预测结果存在Y_predict中
    在这里插入图片描述
    最后我们使用模型自带的评估函数对K近邻分类器在鸾尾花数据上的预测性能进行评估


    可以看到,K近邻分类器对38条鸾尾花测试样本的准确性约为89.47%,平均精确率、召回率以及F1指标分别为0.92、0.89、0.90.

    K近邻算法模型没有参数训练过程,也就是说,该模型并没有通过任何学习算法分析训练数据,而是只是根据测试样本在训练数据的分布直接做出分类决策。因此,K近邻属于无参数模型中非常简单的一种。

    展开全文
  • 常用分类算法总结

    万次阅读 2015-08-30 09:13:56
    分类任务就是明确对象属于哪个预定义的目标类。...常用的分类算法有决策树分类法,基于规则的分类算法,神经网络,支持向量机和朴素贝叶斯分类法。 下面主要介绍各个算法的应用场景和一些优缺点 (1)决策树
  • 常见分类算法

    万次阅读 2018-05-17 11:38:48
    常见分类算法 朴素贝叶斯网络、贝叶斯信念网络、随机森林、k-最近邻分类 云聚类算法引擎 k-Means、Canopy、Fuzzy K-Means、Mean Shift 云关联规则算法引起 FP-Growth关联规则 云智能推荐算法引擎 基于内存的...
  • k-近邻算法是基本的机器学习算法算法的原理非常简单: 输入样本数据后,计算输入样本和参考样本之间的距离,找出离输入样本距离最近的k个样本,找出这k个样本中...下面分类器的python代码: ''' kNNClassify(inp
  • 深入理解GBDT二分类算法

    千次阅读 2020-02-28 20:04:54
    目录:GBDT分类算法简介GBDT二分类算法2.1 逻辑回归的对数损失函数2.2 GBDT二分类原理GBDT二分类算法实例手撕GBDT二分类算法4.1 用Python3实现GBDT二分类...
  • 大数据分析之分类算法

    万次阅读 2016-09-09 14:04:37
    数据分析之决策树ID3算法什么是分类算法分类算法跟之前的聚类都是让不同对象个体划分到不同的组中的。但是分类不同之处在于类别在运算之前就已经是确定的。 分类是根据训练数据集合,结合某种分类算法,比如这...
  • 分类算法概述

    千次阅读 2010-12-23 23:41:00
    通过对当前数据挖掘中具有代表性的优秀分类算法进行分析和比较,总结出了各种算法的特性,为使用者选择算法或研究者改进算法提供了依据。 <br />1 概述 <br />分类是一种重要的数据挖掘技术。分类的目的是...
  • kNN分类算法及案例

    千次阅读 2019-11-13 15:01:14
    kNN分类算法及案例K-近邻算法概述新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • 决策树分类算法

    千次阅读 2016-10-26 15:56:22
    最近在学习数据挖掘,算法的重要性可想而知,先学习下理论,本篇是关于决策树算法,参考了一些博客,觉得写的非常不错。后面会结合代码来实现这些算法,并尝试着使用mahout等框架来使用这些算法解决实际的问题
  • 详解朴素贝叶斯分类算法

    万次阅读 多人点赞 2018-08-15 22:25:31
    带你搞懂朴素贝叶斯分类算法   带你搞懂朴素贝叶斯分类算 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类...
  • 五个例子秒懂分类算法

    千次阅读 多人点赞 2019-01-19 19:25:00
    下面用五个分类算法进行区分小明是好学生还是坏学生。 K近邻算法 以家长的视角给出: “别和坏学生在一起玩耍,否则你也会和他们一样。”这种思想就是K近邻算法,通过统计离待测样本最近的K个样本的类...
  • 从决策树学习谈到贝叶斯分类算法、EM、HMM

    万次阅读 多人点赞 2012-05-17 21:06:53
    第一篇:从决策树学习谈到贝叶斯分类算法、EM、HMM (Machine Learning & Data Mining交流群:8986884)引言 最近在面试中,除了基础 & 算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道...
  • 常见分类算法应用范围/数据要求

    千次阅读 2019-10-28 19:58:08
    单一的分类算法:决策树、贝叶斯、人工神经网络、K-近邻、支持向量机和基于关联规则的分类,HMM 组合分类算法:Bagging和Boosting k-近邻(kNN,k-Nearest Neighbors)算法 找出与未知样本x距离最近的k个训练样本,看...
  • 如果你想对一个陌生的文本进行分类处理,例如新闻、游戏或是编程相关。那么贝叶斯分类算法应该正是你所要找的了。贝叶斯分类算法是统计学中的一种...下面我们就针对朴素贝叶斯分类算法,进行原理浅析和文本分类实践。
  • 文本分类算法

    千次阅读 2011-11-25 15:17:55
    文本分类大致有两种方法:一种是基于训练集的文本分类方法;另一种是基于分类词表的文本分类方法。两种方法出自不同角度的研究者,训练集法更多的来自计算机或人工智能研究领域,而分类表法则更多地来自突出情报领域...
  •  本工程采用的模型方法为朴素贝叶斯分类算法,它的核心算法思想基于概率论。我们称之为“朴素”,是因为整个形式化过程只做最原始、最简单的假设。朴素贝叶斯是贝叶斯决策理论的一部分,所以讲述朴素贝叶斯之前有...
  • Adaboost基本二分类算法

    千次阅读 2018-12-04 15:40:42
    最早类型的Adaboost是由Yoav Freund和Robert E.Schapire提出的,一种用于二分类的boosting集成学习方法。也是李航《统计学习方法》中所介绍的Adaboost。它将一系列弱分类器的线性组合,生成一个强分类器。需要注意的...
  • 简单明了的分类算法:OneR。

    千次阅读 2018-01-12 17:25:44
    在之前介绍的kNN算法属于一种分类算法,之后会介绍的决策树也是属于分类算法分类算法的目的就是根据训练集的特征将新的数据进行预测,当然能够找到特征之间的联系越多那么最后的分类结果也就应该越准确。但是有...
  • 分类算法之决策树CART算法

    千次阅读 2017-08-21 11:01:06
     Classification And Regression Tree,即分类回归树算法,简称CART算法,它是决策树的一种实现,通常决策树主要有三种实现,分别是ID3算法,CART算法和C4.5算法。  CART算法是一种二分递归分割技术,把当前样本...
  • 人工智能实验三:分类算法实验

    万次阅读 2019-04-14 17:19:14
    1、巩固4种基本的分类算法的算法思想:朴素贝叶斯算法,决策树算法,人工神经网络,支持向量机算法; 2、能够使用现有的分类器算法代码进行分类操作; 3、学习如何调节算法的参数以提高分类性能; 二、实验硬件...
  • 用朴素贝叶斯分类算法做中文文本分类

    万次阅读 热门讨论 2016-07-07 11:08:15
    朴素贝叶斯分类算法的原理 朴素贝叶斯分类器基于属性条件独立假设:对于已知类别,假设所有属性相互独立,也就是说,假设每个属性独立地对分类结果产生影响。 设待分类的样本属性集为TTT,其中包含nnn个属性,...
  • 常见分类算法优缺点

    千次阅读 2018-10-21 21:36:54
    机器学习算法太多了,分类、回归、聚类、推荐、图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验。通常最开始我们都会选择大家普遍认同的算法,诸如SVM...
  • 实验二 分类算法实验

    万次阅读 2017-12-24 16:32:06
    巩固4种基本的分类算法的算法思想:朴素贝叶斯算法,决策树算法,人工神经网络,支持向量机算法; 2.能够使用现有的分类器算法代码进行分类操作 3.学习如何调节算法的参数以提高分类性能;二、实验的硬件、软件平台...
  • 分类算法概述与比较

    万次阅读 2011-12-09 08:46:37
    通过对当前数据挖掘中具有代表性的优秀分类算法进行分析和比较,总结出了各种算法的特性,为使用者选择算法或研究者改进算法提供了依据。 一、分类算法概述 解决分类问题的方法很多 ,单一的分类方法主要包括:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 231,393
精华内容 92,557
关键字:

下面属于分类算法的是