mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2025-10-20 08:53:50 +08:00
mod
This commit is contained in:
99
极客时间专栏/从0开始学大数据/模块六 大数据算法/37 | 如何对数据进行分类和预测?.md
Normal file
99
极客时间专栏/从0开始学大数据/模块六 大数据算法/37 | 如何对数据进行分类和预测?.md
Normal file
@@ -0,0 +1,99 @@
|
||||
<audio id="audio" title="37 | 如何对数据进行分类和预测?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/eb/be/eb23651089242930188517f273bbcdbe.mp3"></audio>
|
||||
|
||||
今天我们进入专栏的最后一个模块,补全大数据知识体系最后一块拼图,一起来学习大数据算法。大数据越来越多的和人工智能关联起来,所谓人工智能就是利用数学统计方法,统计数据中的规律,然后利用这些统计规律进行自动化数据处理,使计算机表现出某种智能的特性,而各种数学统计方法,就是大数据算法。关于专栏算法模块的设置,我会围绕数据分类、数据挖掘、推荐引擎、大数据算法的数学原理、神经网络算法几个方面,为你展开大数据算法的“全景图”。
|
||||
|
||||
分类是人们认知事物的重要手段,如果你能将某个事物分类得足够细,你实际上就已经认知了这个事物。如果你能将一个人从各个维度,比如专业能力、人际交往、道德品行、外貌特点各个方面都进行正确的分类,并且在每个维度的基础上还能再细分,比如大数据专业能力、Java编程能力、算法能力也能正确分类,那么可以说你已经完全了解这个人了。
|
||||
|
||||
现实中,几乎没有人能够完全将另一个人分类。也就是说,几乎没有人能完全了解另一个人。但是在互联网时代,一个人在互联网里留下越来越多的信息,如果计算机利用大数据技术将所有这些信息都统一起来进行分析,理论上可以将一个人完全分类,也就是完全了解一个人。
|
||||
|
||||
分类也是大数据常见的应用场景之一,通过对历史数据规律的统计,将大量数据进行分类然后发现数据之间的关系,这样当有新的数据进来时,计算机就可以利用这个关系自动进行分类了。更进一步讲,如果这个分类结果在将来才会被证实,比如一场比赛的胜负、一次选举的结果,那么在旁观者看来,就是在利用大数据进行预测了。其实,现在火热的机器学习本质上说就是统计学习。
|
||||
|
||||
下面我通过一个相对比较简单的KNN分类算法,向你展示大数据分类算法的特点和应用,以及各种大数据算法都会用到的数据距离计算方法和特征值处理方法。
|
||||
|
||||
## KNN分类算法
|
||||
|
||||
KNN算法,即K近邻(K Nearest Neighbour)算法,是一种基本的分类算法。其主要原理是:对于一个需要分类的数据,将其和一组已经分类标注好的样本集合进行比较,得到距离最近的K个样本,K个样本最多归属的类别,就是这个需要分类数据的类别。下面我给你画了一个KNN算法的原理图。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/ef/d4/ef51184bbc5ecf8e0eb71c8c834557d4.png" alt="">
|
||||
|
||||
图中,红蓝绿三种颜色的点为样本数据,分属三种类别$w_{1}$、$w_{2}$、 $w_{3}$ 。对于待分类点$X_{u}$ ,计算和它距离最近的5个点(即K为5),这5个点最多归属的类别为$w_{1}$(4个点归属$w_{1}$,1个点归属$w_{3}$),那么$X_{u}$的类别被分类为$w_{1}$。
|
||||
|
||||
KNN的算法流程也非常简单,请看下面的流程图。
|
||||
|
||||
KNN算法是一种非常简单实用的分类算法,可用于各种分类的场景,比如新闻分类、商品分类等,甚至可用于简单的文字识别。对于新闻分类,可以提前对若干新闻进行人工标注,标好新闻类别,计算好特征向量。对于一篇未分类的新闻,计算其特征向量后,跟所有已标注新闻进行距离计算,然后进一步利用KNN算法进行自动分类。
|
||||
|
||||
读到这你肯定会问,如何计算数据的距离呢?如何获得新闻的特征向量呢?
|
||||
|
||||
## 数据的距离
|
||||
|
||||
KNN算法的关键是要比较需要分类的数据与样本数据之间的距离,这在机器学习中通常的做法是:提取数据的特征值,根据特征值组成一个n维实数向量空间(这个空间也被称作特征空间),然后计算向量之间的空间距离。空间之间的距离计算方法有很多种,常用的有欧氏距离、余弦距离等。
|
||||
|
||||
对于数据$x_{i}$和$x_{j}$,若其特征空间为n维实数向量空间$R^{n}$,即$x_{i}=(x_{i1},x_{i2},…,x_{in})$,$x_{j}=(x_{j1},x_{j2},…,x_{jn})$,则其欧氏距离计算公式为
|
||||
|
||||
$$d(x_{i},x_{j})=\sqrt{\sum_{k=1}^{n}{(x_{ik}-x_{jk})^2}}$$
|
||||
|
||||
这个欧式距离公式其实我们在初中的时候就学过,平面几何和立体几何里两个点之间的距离,也是用这个公式计算出来的,只是平面几何(二维几何)里的n=2,立体几何(三维几何)里的n=3,而机器学习需要面对的每个数据都可能有n维的维度,即每个数据有n个特征值。但是不管特征值n是多少,两个数据之间的空间距离的计算公式还是这个欧氏计算公式。大多数机器学习算法都需要计算数据之间的距离,因此掌握数据的距离计算公式是掌握机器学习算法的基础。
|
||||
|
||||
欧氏距离是最常用的数据计算公式,但是在文本数据以及用户评价数据的机器学习中,更常用的距离计算方法是余弦相似度。
|
||||
|
||||
$$cos(\theta)=\frac{\sum_{k=1}^{n}{x_{ik}x_{jk}}}{\sqrt{\sum_{k=1}^{n}{x_{ik}^{2}}}\sqrt{\sum_{k=1}^{n}{x_{jk}^{2}}}}$$
|
||||
|
||||
余弦相似度的值越接近1表示其越相似,越接近0表示其差异越大,使用余弦相似度可以消除数据的某些冗余信息,某些情况下更贴近数据的本质。我举个简单的例子,比如两篇文章的特征值都是:“大数据”“机器学习”和“极客时间”,A文章的特征向量为(3, 3, 3),即这三个词出现次数都是3;B文章的特征向量为(6, 6, 6),即这三个词出现次数都是6。如果光看特征向量,这两个向量差别很大,如果用欧氏距离计算确实也很大,但是这两篇文章其实非常相似,只是篇幅不同而已,它们的余弦相似度为1,表示非常相似。
|
||||
|
||||
余弦相似度其实是计算向量的夹角,而欧氏距离公式是计算空间距离。余弦相似度更关注数据的相似性,比如两个用户给两件商品的打分分别是(3, 3)和(4, 4),那么两个用户对两件商品的喜好是相似的,这种情况下,余弦相似度比欧氏距离更合理。
|
||||
|
||||
## 文本的特征值
|
||||
|
||||
我们知道了机器学习的算法需要计算距离,而计算距离还需要知道数据的特征向量,因此提取数据的特征向量是机器学习工程师们的重要工作,有时候甚至是最重要的工作。不同的数据以及不同的应用场景需要提取不同的特征值,我们以比较常见的文本数据为例,看看如何提取文本特征向量。
|
||||
|
||||
文本数据的特征值就是提取文本关键词,TF-IDF算法是比较常用且直观的一种文本关键词提取算法。这种算法是由TF和IDF两部分构成。
|
||||
|
||||
TF是词频(Term Frequency),表示某个单词在文档中出现的频率,一个单词在一个文档中出现得越频繁,TF值越高。
|
||||
|
||||
词频: $$ TF=\frac{某个词在文档中出现的次数}{文档总词数}$$
|
||||
|
||||
IDF是逆文档频率(Inverse Document Frequency),表示这个单词在所有文档中的稀缺程度,越少文档出现这个词,IDF值越高。
|
||||
|
||||
逆文档频率:$$IDF=log(\frac{所有的文档总数}{出现该词的文档数})$$
|
||||
|
||||
TF与IDF的乘积就是TF-IDF。
|
||||
|
||||
$$TF-IDF=TF\times IDF$$
|
||||
|
||||
所以如果一个词在某一个文档中频繁出现,但在所有文档中却很少出现,那么这个词很可能就是这个文档的关键词。比如一篇关于原子能的技术文章,“核裂变”“放射性”“半衰期”等词汇会在这篇文档中频繁出现,即TF很高;但是在所有文档中出现的频率却比较低,即IDF也比较高。因此这几个词的TF-IDF值就会很高,就可能是这篇文档的关键词。如果这是一篇关于中国原子能的文章,也许“中国”这个词也会频繁出现,即TF也很高,但是“中国”也在很多文档中出现,那么IDF就会比较低,最后“中国”这个词的TF-IDF就很低,不会成为这个文档的关键词。
|
||||
|
||||
提取出关键词以后,就可以利用关键词的词频构造特征向量,比如上面例子关于原子能的文章,“核裂变”“放射性”“半衰期”这三个词是特征值,分别出现次数为12、9、4。那么这篇文章的特征向量就是(12, 9, 4),再利用前面提到的空间距离计算公式计算与其他文档的距离,结合KNN算法就可以实现文档的自动分类。
|
||||
|
||||
## 贝叶斯分类
|
||||
|
||||
贝叶斯公式是一种基于条件概率的分类算法,如果我们已经知道A和B的发生概率,并且知道了B发生情况下A发生的概率,可以用贝叶斯公式计算A发生的情况下B发生的概率。事实上,我们可以根据A的情况,即输入数据,判断B的概率,即B的可能性,进而进行分类。
|
||||
|
||||
举个例子:假设一所学校里男生占60%,女生占40%。男生总是穿长裤,女生则一半穿长裤一半穿裙子。假设你走在校园中,迎面走来一个穿长裤的学生,你能够推断出这个穿长裤学生是男生的概率是多少吗?
|
||||
|
||||
答案是75%,具体算法是:
|
||||
|
||||
$$穿长裤是男生的概率 = \frac{男生穿长裤的概率 \times 是男生的概率}{学生穿长裤的概率}$$
|
||||
|
||||
这个算法就利用了贝叶斯公式,贝叶斯公式的写法是:
|
||||
|
||||
$$P(B|A)= \frac{P(A|B)*P(B)}{P(A)}$$
|
||||
|
||||
意思是A发生的条件下B发生的概率,等于B发生的条件下A发生的概率,乘以B发生的概率,除以A发生的概率。还是上面这个例子,如果我问你迎面走来穿裙子的学生是女生的概率是多少。同样带入贝叶斯公式,可以计算出是女生的概率为100%。其实这个结果我们根据常识也能推断出来,但是很多时候,常识受各种因素的干扰,会出现偏差。比如有人看到一篇博士生给初中学历老板打工的新闻,就感叹读书无用。事实上,只是少见多怪,样本量太少而已。而大量数据的统计规律则能准确反映事物的分类概率。
|
||||
|
||||
贝叶斯分类的一个典型的应用场合是垃圾邮件分类,通过对样本邮件的统计,我们知道每个词在邮件中出现的概率$P(A_{i})$,我们也知道正常邮件概率$P(B_{0})$和垃圾邮件的概率$P(B_{1})$,还可以统计出垃圾邮件中各个词的出现概率$P(A_{i}|B_{1})$,那么现在一封新邮件到来,我们就可以根据邮件中出现的词,计算$P(B_{1}|A_{i})$,即得到这些词出现情况下,邮件为垃圾邮件的概率,进而判断邮件是否为垃圾邮件。
|
||||
|
||||
现实中,贝叶斯公式等号右边的概率,我们可以通过对大数据的统计获得,当有新的数据到来的时候,我们就可以带入上面的贝叶斯公式计算其概率。而如果我们设定概率超过某个值就认为其会发生,那么我们就对这个数据进行了分类和预测,具体过程如下图所示。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/bd/d4/bd5eb81d7acd7c84b1070b5f2ec3b3d4.png" alt="">
|
||||
|
||||
训练样本就是我们的原始数据,有时候原始数据并不包含我们想要计算的维度数据,比如我们想用贝叶斯公式自动分类垃圾邮件,那么首先要对原始邮件进行标注,需要标注哪些邮件是正常邮件、哪些邮件是垃圾邮件。这一类需要对数据进行标注才能进行的机器学习训练也叫作有监督的机器学习。
|
||||
|
||||
## 小结
|
||||
|
||||
分类是机器学习非常重要的一类算法,很多场景都需要用到分类,很多AI其实都是分类算法在起作用。比如AI围棋算法AlphaGo本质就是一个分类算法,围棋棋盘有361个交叉点,可以认为有361个分类选项,AlphaGo只要每次选择一个有最大赢面的分类选项输出即可,具体我们在神经网络一期再来讨论。
|
||||
|
||||
## 思考题
|
||||
|
||||
KNN算法的简单实现只需要几十行代码,请用你熟悉的编程语言实现KNN。
|
||||
|
||||
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。
|
121
极客时间专栏/从0开始学大数据/模块六 大数据算法/38 | 如何发掘数据之间的关系?.md
Normal file
121
极客时间专栏/从0开始学大数据/模块六 大数据算法/38 | 如何发掘数据之间的关系?.md
Normal file
@@ -0,0 +1,121 @@
|
||||
<audio id="audio" title="38 | 如何发掘数据之间的关系?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/0c/fa/0c0a6e0bee47b23bae0cee7b64c0f2fa.mp3"></audio>
|
||||
|
||||
通过上一个模块“大数据分析与运营”的学习,我们知道数据之中蕴藏着关系,如果数据量足够大,这种关系越逼近真实世界的客观规律。在我们的工作和生活中你会发现,网页之间的链接关系蕴藏着网页的重要性排序关系,购物车的商品清单蕴藏着商品的关联关系,通过对这些关系的挖掘,可以帮助我们更清晰地了解客观世界的规律,并利用规律提高生产效率,进一步改造我们的世界。
|
||||
|
||||
挖掘数据的典型应用场景有搜索排序、关联分析以及聚类,下面我们一个一个来看,希望通过今天的学习,你能够了解数据挖掘典型场景及其应用的算法。
|
||||
|
||||
## 搜索排序
|
||||
|
||||
我们说过Hadoop大数据技术最早源于Google,而Google使用大数据技术最重要的应用场景就是网页排名。
|
||||
|
||||
当我们使用Google进行搜索的时候,你会发现,通常在搜索的前三个结果里就能找到自己想要的网页内容,而且很大概率第一个结果就是我们想要的网页。而排名越往后,搜索结果与我期望的偏差越大。并且在搜索结果页的上面,会提示总共找到多少个结果。
|
||||
|
||||
那么Google为什么能在十几万的网页中知道我最想看的网页是哪些,然后把这些页面排到最前面呢?
|
||||
|
||||
答案是Google使用了一种叫PageRank的算法,这种算法根据网页的链接关系给网页打分。如果一个网页A,包含另一个网页B的超链接,那么就认为A网页给B网页投了一票,以下面四个网页A、B、C、D举例,带箭头的线条表示链接。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/9b/06/9b83178ecf692570c8e0f8e7ba554c06.png" alt="">
|
||||
|
||||
B网页包含了A、D两个页面的超链接,相当于B网页给A、D每个页面投了一票,初始的时候,所有页面都是1分,那么经过这次投票后,B给了A和D每个页面1/2分(B包含了A、D两个超链接,所以每个投票值1/2分),自己从C页面得到1/3分(C包含了A、B、D三个页面的超链接,每个投票值1/3分)。
|
||||
|
||||
而A页面则从B、C、D分别得到1/2、1/3、1分。用公式表示就是
|
||||
|
||||
$$PR(A) = \frac{PR(B)}{2}+\frac{PR( C )}{3}+\frac{PR(D)}{1}$$
|
||||
|
||||
等号左边是经过一次投票后,A页面的PageRank分值;等号右边每一项的分子是包含A页面超链接的页面的PageRank分值,分母是该页面包含的超链接数目。
|
||||
|
||||
这样经过一次计算后,每个页面的PageRank分值就会重新分配,重复同样的算法过程,经过几次计算后,根据每个页面PageRank分值进行排序,就得到一个页面重要程度的排名表。根据这个排名表,将用户搜索出来的网页结果排序,排在前面的通常也正是用户想要的结果。
|
||||
|
||||
但是这个算法还有个问题,如果某个页面只包含指向自己的超链接,这样的话其他页面不断给它送分,而自己一分不出,随着计算执行次数越多,它的分值也就越高,这显然是不合理的。这种情况就像下图所示的,A页面只包含指向自己的超链接。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/db/96/db561c04aa865171f94cec495d0ab296.png" alt="">
|
||||
|
||||
Google的解决方案是,设想浏览一个页面的时候,有一定概率不是点击超链接,而是在地址栏输入一个URL访问其他页面,表示在公式上,就是
|
||||
|
||||
$$PR(A) = \alpha(\frac{PR(B)}{2}+\frac{PR( C )}{3}+\frac{PR(D)}{1})+\frac{(1-\alpha)}{4}$$
|
||||
|
||||
上面$(1-\alpha)$就是跳转到其他任何页面的概率,通常取经验值0.15(即$\alpha$ 为0.85),因为有一定概率输入的URL是自己的,所以加上上面公式最后一项,其中分母4表示所有网页的总数。
|
||||
|
||||
那么对于$N$个网页,任何一个页面$P_{i}$的PageRank计算公式如下
|
||||
|
||||
$$PageRank(P_{i})=\alpha \sum_{P_{j}\in M(P_{i})}^{}{\frac{PageRank(P_{j})}{L(P_{j})}} + \frac{1-\alpha}{N}$$
|
||||
|
||||
公式中,$P_{j}\in M(P_{i})$表示所有包含有$P_{i}$超链接的$P_{j}$,$L(P_{j})$表示$P_{j}$页面包含的超链接数,$N$表示所有的网页总和。
|
||||
|
||||
由于Google要对全世界的网页进行排名,所以这里的N可能是一个万亿级的数字,一开始将所有页面的PageRank值设为1,带入上面公式计算,每个页面都得到一个新的PageRank值。再把这些新的PageRank值带入上面的公式,继续得到更新的PageRank值,如此迭代计算,直到所有页面的PageRank值几乎不再有大的变化才停止。
|
||||
|
||||
在这样大规模的数据上进行很多次迭代计算,是传统计算方法根本解决不了的问题,这就是Google要研发大数据技术的原因,并因此诞生了一个大数据行业。而PageRank算法也让Google从众多搜索引擎公司脱颖而出,铸就了Google接近万亿级美元的市值,开创了人类科技的新纪元。
|
||||
|
||||
## 关联分析
|
||||
|
||||
关联分析是大数据计算的重要场景之一,我在专栏开篇的时候就讨论过一个经典案例,通过数据挖掘,商家发现尿不湿和啤酒经常会同时被购买,所以商家就把啤酒和尿不湿摆放在一起促进销售。这个案例曾经被质疑是假的,因为没有人见过超市把啤酒和尿布放在一起卖。
|
||||
|
||||
我在写专栏文章的时候,访问了京东的沃尔玛官方旗舰店,哈尔滨啤酒下方的六个店长推荐,两个是儿童纸尿裤,还有两个儿童奶粉。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/22/3e/22ae664022a77fd03b0ada95fe12cd3e.png" alt="">
|
||||
|
||||
在传统商超确实没有见过把啤酒和纸尿裤放在一起的情况,可能是因为传统商超的物理货架分区策略限制它没有办法这么做,而啤酒和尿不湿存在关联关系则确实是大数据中存在的规律,在电子商务网站就可以轻易进行关联推荐。
|
||||
|
||||
通过商品订单,可以发现频繁出现在同一个购物篮里商品间的关联关系,这种大数据关联分析也被称作是“购物篮分析”,频繁出现的商品组合也被称作是“频繁模式”。
|
||||
|
||||
在深入关联分析前,你需要先了解两个基本概念,一个是**支持度**,一个是**置信度**。
|
||||
|
||||
支持度是指一组频繁模式的出现概率,比如(啤酒,尿不湿)是一组频繁模式,它的支持度是4%,也就是说,在所有订单中,同时出现啤酒和尿不湿这两件商品的概率是4%。
|
||||
|
||||
置信度用于衡量频繁模式内部的关联关系,如果出现尿不湿的订单全部都包含啤酒,那么就可以说购买尿不湿后购买啤酒的置信度是100%;如果出现啤酒的订单中有20%包含尿不湿,那么就可以说购买啤酒后购买尿不湿的置信度是20%。
|
||||
|
||||
大型超市的商品种类数量数以万计,所有商品的组合更是一个天文数字;而电子商务网站的商品种类更多,历史订单数据同样也非常庞大,虽然我们有大数据技术,但是资源依然是有限的。
|
||||
|
||||
那我们应该从哪里考虑着手,可以使用最少的计算资源寻找到最小支持度的频繁模式?寻找满足最小支持度的频繁模式经典算法是Apriori算法,Apriori算法的步骤是:
|
||||
|
||||
第1步:设置最小支持度阈值。
|
||||
|
||||
第2步:寻找满足最小支持度的单件商品,也就是单件商品出现在所有订单中的概率不低于最小支持度。
|
||||
|
||||
第3步:从第2步找到的所有满足最小支持度的单件商品中,进行两两组合,寻找满足最小支持度的两件商品组合,也就是两件商品出现在同一个订单中概率不低于最小支持度。
|
||||
|
||||
第4步:从第3步找到的所有满足最小支持度的两件商品,以及第2步找到的满足最小支持度的单件商品进行组合,寻找满足最小支持度的三件商品组合。
|
||||
|
||||
第5步:以此类推,找到所有满足最小支持度的商品组合。
|
||||
|
||||
Apriori算法极大地降低了需要计算的商品组合数目,这个算法的原理是,如果一个商品组合不满足最小支持度,那么所有包含这个商品组合的其他商品组合也不满足最小支持度。所以从最小商品组合,也就是一件商品开始计算最小支持度,逐渐迭代,进而筛选出所有满足最小支持度的频繁模式。
|
||||
|
||||
通过关联分析,可以发现看似不相关商品的关联关系,并利用这些关系进行商品营销,比如我上面提到的啤酒和尿不湿的例子,一方面可以为用户提供购买便利;另一方面也能提高企业营收。专栏下一期还会讲到更多发现用户兴趣进行推荐的算法。
|
||||
|
||||
## 聚类
|
||||
|
||||
上一期我们讨论了“分类”,分类算法主要解决如何将一个数据分到几个确定类别中的一类里去。分类算法通常需要样本数据训练模型,再利用模型进行数据分类,那么一堆样本数据又如何知道各自的类别呢?样本数据归类一方面可以通过人工手动打标签,另一方面也可以利用算法进行自动归类,即所谓的“聚类”。
|
||||
|
||||
聚类就是对一批数据进行自动归类,如下图这样的一组数据,人眼一眼就可以识别出可以分为四组。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/85/f8/85160615236f6ebd9ad28588fb1797f8.png" alt="">
|
||||
|
||||
但是如果这些数据不是画在平面上,而是以二维坐标的方式给你一堆数据,你还能看出来吗?
|
||||
|
||||
K-means是一种在给定分组个数后,能够对数据进行自动归类,即聚类的算法。计算过程请看图中这个例子。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/89/a1/89bfae60c0a871d0c102c905169463a1.png" alt="">
|
||||
|
||||
第1步:随机在图中取K个种子点,图中K=2,即图中的实心小圆点。
|
||||
|
||||
第2步:求图中所有点到这K个种子点的距离,假如一个点离种子点X最近,那么这个点属于X点群。在图中,可以看到A、B属于上方的种子点,C、D、E属于中部的种子点。
|
||||
|
||||
第3步:对已经分好组的两组数据,分别求其中心点。对于图中二维平面上的数据,求中心点最简单暴力的算法就是对当前同一个分组中所有点的X坐标和Y坐标分别求平均值,得到的<x,y>就是中心点。
|
||||
|
||||
第4步:重复第2步和第3步,直到每个分组的中心点不再移动。这时候,距每个中心点最近的点数据聚类为同一组数据。
|
||||
|
||||
K-means算法原理简单,在知道分组个数的情况下,效果非常好,是聚类经典算法。通过聚类分析我们可以发现事物的内在规律:具有相似购买习惯的用户群体被聚类为一组,一方面可以直接针对不同分组用户进行差别营销,线下渠道的话还可以根据分组情况进行市场划分;另一方面可以进一步分析,比如同组用户的其他统计特征还有哪些,并发现一些有价值的模式。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我们聊了数据挖掘的几个典型算法,PageRank算法通过挖掘链接关系,发现互联网网页的排名权重;Apriori算法通过购物篮分析,发现商品的频繁模式;K-means算法则可以进行自动数据聚类。这些算法不需要人工事先对数据进行标注,一般被称作无监督算法。上期的分类算法需要样本数据,而这些样本数据是需要人工进行预先标注的,因此分类算法一般都是有监督算法。
|
||||
|
||||
数据挖掘其实在大数据出现之前,甚至在计算机出现之间就已经存在了,因为挖掘数据中的规律可以帮助我们更好地认识这个世界,最终实现更好地改造这个世界。大数据技术使数据挖掘更加方便、成本更低,而几乎各种大数据产品都有对应的算法库可以方便地进行大数据挖掘。所以请保持好奇心,通过数据挖掘发现规律,进而可以创造更多的价值。
|
||||
|
||||
## 思考题
|
||||
|
||||
网页的链接关系如何用数据表示呢?PageRank算法用MapReduce或者Spark编程如何实现呢?
|
||||
|
||||
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。
|
||||
|
||||
|
67
极客时间专栏/从0开始学大数据/模块六 大数据算法/39 | 如何预测用户的喜好?.md
Normal file
67
极客时间专栏/从0开始学大数据/模块六 大数据算法/39 | 如何预测用户的喜好?.md
Normal file
@@ -0,0 +1,67 @@
|
||||
<audio id="audio" title="39 | 如何预测用户的喜好?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/12/28/12184f1c2b016bcf5eee13b340d4e428.mp3"></audio>
|
||||
|
||||
在用户对自己需求相对明确的时候,可以用搜索引擎通过关键字搜索很方便地找到自己需要的信息。但有些时候,搜索引擎并不能完全满足用户对信息发现的需求。一方面,用户有时候其实对自己的需求并不明确,期望系统能主动推荐一些自己感兴趣的内容或商品;另一方面,企业也希望能够通过更多渠道向用户推荐信息和商品,在改善用户体验的同时,提高成交转化率,获得更多营收。而这中间发现用户兴趣和喜好的就是推荐引擎。
|
||||
|
||||
在豆瓣中打开电影《肖申克的救赎》的页面,你会发现这个页面还会推荐一些其他电影。如果你喜欢《肖申克的救赎》,那么有很大概率你也会喜欢下面这些电影,这就是推荐引擎发挥的作用。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/c2/aa/c2a3f2a9c8c4235c69df748f7aa5baaa.png" alt="">
|
||||
|
||||
推荐引擎的思想其实很早就存在了,后来随着大数据技术的发展,推荐引擎的普及程度和重要性也越来越高,淘宝曾经就主推“千人千面”,要让每个用户打开的淘宝都不一样,背后的核心技术就是推荐引擎。现在稍有规模的互联网应用几乎都有推荐功能,而一些新兴崛起的互联网产品,推荐功能甚至是其核心产品特点与竞争优势,比如今日头条,就是靠智能推荐颠覆了互联网新闻资讯领域。
|
||||
|
||||
那么推荐引擎如何预测用户的喜好,进行正确的推荐呢?主要就是依靠各种推荐算法,常用的推荐算法有:基于人口统计的推荐、基于商品属性的推荐、基于用户的协同过滤推荐、基于商品的协同过滤推荐。
|
||||
|
||||
## 基于人口统计的推荐
|
||||
|
||||
基于人口统计的推荐是相对比较简单的一种推荐算法,根据用户的基本信息进行分类,然后将商品推荐给同类用户。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/72/dc/72fc3fa7c813520e951b3ffc92079adc.png" alt="">
|
||||
|
||||
从图中可以看到,用户A和用户C有相近的人口统计信息,划分为同类,那么用户A喜欢(购买过)的商品D就可以推荐给用户C。基于人口统计的推荐比较简单,只要有用户的基本信息就可以进行分类,新注册的用户总可以分类到某一类别,那么立即就可以对他进行推荐,没有所谓的“冷启动”问题,也就是不会因为不知道用户的历史行为数据而不知道该如何向用户推荐。
|
||||
|
||||
而且这种推荐算法也不依赖商品的数据,和要推荐的领域无关,不管是服装还是美食,不管是电影还是旅游目的地,都可以进行推荐,甚至可以混杂在一起进行推荐。
|
||||
|
||||
当然也正因为这种推荐算法比较简单,对于稍微精细一点的场景,推荐效果就比较差了。因此,在人口统计信息的基础上,根据用户浏览、购买信息和其他相关信息,进一步细化用户的分类信息,给用户贴上更多的标签,比如家庭成员、婚姻状况、居住地、学历、专业、工作等,即所谓的用户画像,根据用户画像进行更精细的推荐,并进一步把用户喜好当做标签完善用户画像,再利用更完善的用户画像进行推荐,如此不断迭代优化用户画像和推荐质量。
|
||||
|
||||
## 基于商品属性的推荐
|
||||
|
||||
前面一个算法是基于用户的属性进行分类,然后根据同类用户的行为进行推荐。而基于商品属性的推荐则是将商品的属性进行分类,然后根据用户的历史行为进行推荐。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/bb/4d/bb6e1fe7e5088dfc206436ebcfabc74d.png" alt="">
|
||||
|
||||
从图中可以看到,电影A和电影D有相似的属性,被划分为同类商品,如果用户A喜欢电影A,那么就可以向用户A推荐电影D,比如给喜欢《星球大战》的用户推荐《星际迷航》。一般来说,相对于基于人口统计的推荐,基于商品属性的推荐会更符合用户的口味,推荐效果相对更好一点。
|
||||
|
||||
但是基于商品属性的推荐需要对商品属性进行全面的分析和建模,难度相对也更大一点,在实践中,一种简单的做法是提取商品描述的关键词和商品的标签作为商品的属性。此外,基于商品属性的推荐依赖用户的历史行为数据,如果是新用户进来,没有历史数据,就没有办法进行推荐了,即存在“冷启动”问题。
|
||||
|
||||
## 基于用户的协同过滤推荐
|
||||
|
||||
基于用户的协同过滤推荐是根据用户的喜好进行用户分类,常用的就是我前面讲过的KNN算法,寻找和当前用户喜好最相近的K个用户,然后根据这些用户的喜好为当前用户进行推荐。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/4d/45/4dabe09dcd5eab8561de7334e396d545.png" alt="">
|
||||
|
||||
从图中可以看到,用户A喜欢商品A、商品B和商品D,用户C喜欢商品A和商品B,那么用户A和用户C就有相似的喜好,可以归为一类,然后将用户A喜欢的商品D推荐给用户C。
|
||||
|
||||
基于用户的协同过滤推荐和基于人口统计的推荐都是将用户分类后,根据同类用户的喜好为当前用户进行推荐。不同的是,基于人口统计的推荐仅仅根据用户的个人信息进行分类,分类的粒度比较大,准确性也较差;而基于用户的协同过滤推荐则根据用户历史喜好进行分类,能够更准确地反映用户的喜好类别,推荐效果也更好一点。今天文章开头举的推荐电影的例子,就是基于用户的协同过滤进行推荐。
|
||||
|
||||
## 基于商品的协同过滤推荐
|
||||
|
||||
基于商品的协同过滤推荐是根据用户的喜好对商品进行分类,如果两个商品,喜欢它们的用户具有较高的重叠性,就认为它们的距离相近,划分为同类商品,然后进行推荐。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/f9/e6/f974ee4c04b4b5206d79b96e351d91e6.png" alt="">
|
||||
|
||||
从图中可以看到,用户A喜欢商品A、商品B和商品D,用户B喜欢商品B、商品C和商品D,那么商品B和商品D的距离最近,划分为同类商品;而用户C喜欢商品B,那么就可以为其推荐商品D。商品的分类相对用户的分类更为稳定,通常情况下,商品的数目也少于用户的数目,因此使用基于商品的协同过滤推荐,计算量和复杂度小于基于用户的协同过滤推荐。
|
||||
|
||||
## 小结
|
||||
|
||||
除了上面这些推荐算法,还有基于模型的推荐,根据用户和商品数据,训练数学模型,然后进行推荐。前面我们讨论过的关联分析,也可以进行推荐。在实践中,通常会混合应用多种算法进行推荐,特别是大型电商网站,推荐效果每进步一点,都可能会带来巨大的营收转化,如果你经常在网上购物,肯定也能感受电商网站这些年在推荐方面的巨大进步。
|
||||
|
||||
互联网发展到现在,历史上那种用户主动搜索,然后选择信息的产品模式几乎已经走到尽头。用户无需做任何操作,打开产品就能立即看到自己想看的信息,正成为新的产品模式,而最近几年快速崛起的互联网产品,也都有这样的特性。今日头条根据你点击的新闻,预测你的关注偏好,不断推荐你感兴趣的内容,让你一打开App,看到的几乎都是你感兴趣的内容。抖音、快手这些产品也是如此,通过不断计算、分析用户喜好,从而优化推荐的结果。某些社交产品甚至将人作为商品进行推荐,不断推荐你可能喜欢的人,遇到喜欢的人向左滑动,不喜欢的向右滑动,然后根据你的喜好进一步优化推荐。
|
||||
|
||||
在未来,随着用户对推荐功能接受程度的不断提高,推荐算法的不断改进,以及包括自然语言处理在内的各种AI技术的进步,系统主动推荐会逐渐成为主要的用户交互方式。也许在不久的将来,你不需要再打开各种App看新闻、点外卖、刷微博、逛淘宝,你的手机就已经非常了解你,它会主动推荐你该看点什么、吃点什么、买点什么、玩点什么。未来的生活可能不是你唤醒你的手机,而是你的手机唤醒你。
|
||||
|
||||
## 思考题
|
||||
|
||||
你在使用互联网产品过程中,发现使用推荐算法的功能有哪些?可能使用了哪些推荐算法?
|
||||
|
||||
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。
|
||||
|
||||
|
97
极客时间专栏/从0开始学大数据/模块六 大数据算法/40 | 机器学习的数学原理是什么?.md
Normal file
97
极客时间专栏/从0开始学大数据/模块六 大数据算法/40 | 机器学习的数学原理是什么?.md
Normal file
@@ -0,0 +1,97 @@
|
||||
<audio id="audio" title="40 | 机器学习的数学原理是什么?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/23/fb/23c45061f5cb901e76487cdd25e41afb.mp3"></audio>
|
||||
|
||||
最近几年,人工智能(AI)的风头俨然已经盖过大数据,成为各大互联网公司争相追捧的新“风口”。但当我们谈论人工智能时我们到底在谈什么?人工智能跟机器学习有什么关系?跟大数据又有什么关系?“高大上”的机器学习背后的数学原理是什么?
|
||||
|
||||
所谓的人工智能,在技术层面很多时候就是指机器学习,通过选择特定的算法对样本数据进行计算,获得一个计算模型,并利用这个模型,对以前未曾见过的数据进行预测。如果这个预测在一定程度上和事实相符,我们就认为机器像人一样具有某种智能,即人工智能。
|
||||
|
||||
这个过程和人类的学习成长非常类似,也是经历一些事情(获得样本数据),进行分析总结(寻找算法),产生经验(产生模型),然后利用经验(模型)指导自己的日常行为。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/3e/90/3e00f3a124580a21b7cbccf8afcaed90.png" alt="">
|
||||
|
||||
机器学习的完整过程也是如此,利用样本数据经过算法训练得到模型,这个模型会和预测系统部署在一起,当外部需要预测的数据到达预测系统的时候,预测系统调用模型,就可以立即计算出预测结果。
|
||||
|
||||
因此,构建一个机器学习系统,需要有三个关键要素:样本、模型、算法。
|
||||
|
||||
## 样本
|
||||
|
||||
样本就是通常我们常说的“训练数据”,包括输入和结果两部分。比如我们要做一个自动化新闻分类的机器学习系统,对于采集的每一篇新闻,能够自动发送到对应新闻分类频道里面,比如体育、军事、财经等。这时候我们就需要批量的新闻和其对应的分类类别作为训练数据。通常随机选取一批现成的新闻素材就可以,但是分类需要人手工进行标注,也就是需要有人阅读每篇新闻,根据其内容打上对应的分类标签。
|
||||
|
||||
数学上,样本通常表示为:
|
||||
|
||||
$$T = (x_{1},y_{1}),(x_{2},y_{2}),…,(x_{n},y_{n})$$
|
||||
|
||||
其中$x_{n}$表示一个输入,比如一篇新闻;$y_{n}$表示一个结果,比如这篇新闻对应的类别。
|
||||
|
||||
样本的数量和质量对机器学习的效果至关重要,如果样本量太少,或者样本分布不均衡,对训练出来的模型就有很大的影响。就像一个人一样,见得世面少、读书也少,就更容易产生偏见和刻板印象。
|
||||
|
||||
## 模型
|
||||
|
||||
模型就是映射样本输入与样本结果的函数,可能是一个条件概率分布,也可能是一个决策函数。一个具体的机器学习系统所有可能的函数构成了模型的假设空间,数学表示是:
|
||||
|
||||
$$F = {f | Y = f(X)}$$
|
||||
|
||||
其中X是样本输入,$Y$是样本输出,$f$就是建立$X$和$Y$映射关系的函数。所有$f$的可能结果构成了模型的假设空间$F$。
|
||||
|
||||
很多时候$F$的函数类型是明确的,需要计算的是函数的参数,比如确定$f$函数为一个线性函数,那么f的函数表示就可以写为:
|
||||
|
||||
$$y = a_{1}x + a_{0}$$
|
||||
|
||||
这时候需要计算的就是$a_{1}$和$a_{0}$两个参数的值。这种情况下模型的假设空间的数学表示是:
|
||||
|
||||
$$F = \left\{f | Y = f_{\theta}(X),\theta\in R^{n} \right\}$$
|
||||
|
||||
其中$\theta$为$f$函数的参数取值空间,一个$n$维欧氏空间,被称作参数空间。
|
||||
|
||||
## 算法
|
||||
|
||||
算法就是要从模型的假设空间中寻找一个最优的函数,使得样本空间的输入$X$经过该函数的映射得到的$f(X)$,和真实的$Y$值之间的距离最小。这个最优的函数通常没办法直接计算得到,即没有解析解,需要用数值计算的方法不断迭代求解。因此如何寻找到$f$函数的全局最优解,以及使寻找过程尽量高效,就构成了机器学习的算法。
|
||||
|
||||
如何保证$f$函数或者$f$函数的参数空间最接近最优解,就是算法的策略。机器学习中用损失函数来评估模型是否最接近最优解。损失函数用来计算模型预测值与真实值的差距,常用的有0-1损失函数、平方损失函数、绝对损失函数、对数损失函数等。以平方损失函数为例,损失函数如下:
|
||||
|
||||
$$L(Y,f(X)) = (Y-f(X))^{2}$$
|
||||
|
||||
对于一个给定的样本数据集
|
||||
|
||||
$$T= \left\{ (x_{1},y_{1}),(x_{2},y_{2}),…,(x_{n},y_{n}) \right\}$$
|
||||
|
||||
模型$f(X)$相对于真实值的平均损失为每个样本的损失函数的求和平均值:
|
||||
|
||||
$$R_{emp}(f)=\frac{1}{N}\sum_{i=1}^{N}{L(y_{i},f(x_{i}))}$$
|
||||
|
||||
这个值被称作经验风险,如果样本量足够大,那么使经验风险最小的$f$函数就是模型的最优解,即求
|
||||
|
||||
$$\min_{f \in F}{\frac{1}{N}\sum_{i=1}^{N}{L(y_{i},f(x_{i}))}}$$
|
||||
|
||||
但是相对于样本空间的可能取值范围,实际中使用的样本量总是有限的,可能会出现使样本经验风险最小的模型$f$函数并不能使实际预测值的损失函数最小,这种情况被称作**过拟合**,即一味追求经验风险最小,而使模型$f$函数变得过于复杂,偏离了最优解。这种情况下,需要引入结构风险以防止过拟合。结构风险表示为:
|
||||
|
||||
$$R_{srm}(f)=\frac{1}{N}\sum_{i=1}^{N}{L(y_{i},f(x_{i}))+\lambda J(f)}$$
|
||||
|
||||
在经验风险的基础上加上$\lambda J(f)$,其中$J(f)$表示模型$f$的复杂度,模型越复杂,$J(f)$越大。要使结构风险最小,就要使经验风险和模型复杂度同时小。求解模型最优解就变成求解结构风险最小值:
|
||||
|
||||
$$\min_{f \in F}{\frac{1}{N}\sum_{i=1}^{N}{L(y_{i},f(x_{i}))+\lambda J(f)}}$$
|
||||
|
||||
## 小结
|
||||
|
||||
今天我所讲的就是机器学习的数学原理:给定模型类型,也就是给定函数类型的情况下,如何寻找使结构风险最小的函数表达式。由于函数类型已经给定,实际上就是求函数的参数。**各种有样本的机器学习算法基本上都是在各种模型的假设空间上求解结构风险最小值的过程**,理解了这一点也就理解了各种机器学习算法的推导过程。
|
||||
|
||||
由于计算机没有办法直接通过解析计算得到需要的函数表达式,因此必须使用数值计算的方式求函数表达式,也就是将大量的样本数据带入数值计算算法迭代计算函数的参数,具体数值计算方法我在专栏下期会举例说明。一个机器学习模型的参数可能有数百万,训练的样本数据则会更多,因此机器学习通常依赖大数据技术进行模型训练,而机器学习及其高阶形态的神经网络、深度学习则是实现人工智能的主要手段。
|
||||
|
||||
对于理解机器学习背后的数学原理,我给你讲个我自己的故事。我大学专业是工业自动化,老实说我学得也不好。应该说从第一门专业基础课《自动控制原理》开始就蒙掉了,不知道在干什么,微分方程、矩阵运算和自动控制有什么关系,好像完全搞不明白。就这样稀里糊涂上了四年,在及格线边缘挣扎了四年,毕业的时候感觉大学白上了四年,特别郁闷,觉得人生太失败了。
|
||||
|
||||
工作多年以后,有一次公司出去团建,有个同事带了一本《星际航行概论》在路上看。起初我以为是一本科幻小说,拿过来随手翻了翻,发现居然是一本技术书。然后就非常好奇,认真看了两页,正好是关于自动控制的部分。这本书将自动控制的基本方法、理论基础、应用场景讲得非常清楚,微分方程和矩阵运算的作用也讲得很透彻。当时看的时候,有一种颤栗的感觉,像是醍醐灌顶一样一种穿透感。当时想,如果我大学的时候能看到这两页书,也许这四年就不一样了。
|
||||
|
||||
这个故事目的是什么呢?我看过一些关于机器学习的书,上来就讲偏微分方程,我不知道别的读者是什么感受,反正我感觉又回到了被大学上的那几年。为什么机器学习要解偏微分方程?机器学习跟偏微分方程究竟是个什么关系?
|
||||
|
||||
事实上,关系很简单。机器学习要从假设空间寻找最优函数,而最优函数就是使样本数据的函数值和真实值距离最小的那个函数。给定函数模型,求最优函数就是求函数的参数值。给定不同参数,得到不同函数值和真实值的距离,这个距离就是损失,损失函数是关于模型参数的函数,距离越小,损失越小。最小损失值对应的函数参数就是最优函数。
|
||||
|
||||
而我们知道,数学上求极小值就是求一阶导数,计算每个参数的一阶导数为零的偏微分方程组,就可以算出最优函数的参数值。这就是为什么机器学习要计算偏微分方程的原因。
|
||||
|
||||
当时我特地关注了下《星际航行概论》这本书的作者,发现是钱学森。又一次被震撼,大师真的可以无所不能啊,当时就想穿越时空给钱老献上膝盖啊!
|
||||
|
||||
顺便说一句,当时带这本书在路上看的同事是阿里巴巴的温少,是JSON解析器fastjson和数据库连接池Druid的作者,这两个作品在国内的开源产品一直排名Top10,做Java开发同学应该都知道。我见过很多技术非常厉害的人都涉猎很广,我觉得他们无论去做哪一行,应该都是高手。
|
||||
|
||||
## 思考题
|
||||
|
||||
大数据、机器学习、人工智能三者的关系究竟是什么?
|
||||
|
||||
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。
|
112
极客时间专栏/从0开始学大数据/模块六 大数据算法/41 | 从感知机到神经网络算法.md
Normal file
112
极客时间专栏/从0开始学大数据/模块六 大数据算法/41 | 从感知机到神经网络算法.md
Normal file
@@ -0,0 +1,112 @@
|
||||
<audio id="audio" title="41 | 从感知机到神经网络算法" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/e3/b9/e33613c66304f5608da5d5f3db16c5b9.mp3"></audio>
|
||||
|
||||
从机器学习模型角度看,目前最简单的机器学习模型大概就是感知机了,而最火热的机器学习模型则是神经网络。人工智能领域几乎所有炫酷的东西都是神经网络的成果,有下赢人类最顶尖围棋棋手的AlphaGo、自动驾驶技术、聊天机器人、语音识别与自动翻译等。事实上,神经网络和感知机是一脉相承的,就像复杂的人体是由一个个细胞组成、复杂的大脑是由一个个神经元组成,而神经网络正是由感知机组成的。
|
||||
|
||||
## 感知机
|
||||
|
||||
感知机是一种比较简单的二分类模型,将输入特征分类为+1、-1两类,就像下图所示的,一条直线将平面上的两类点分类。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/b2/bd/b2c13b1dee2a9cb412512973075eaabd.png" alt="">
|
||||
|
||||
二维平面上的点只有两个输入特征(横轴坐标和纵轴坐标),一条直线就可以分类。如果输入数据有更多维度的特征,那么就需要建立同样多维度的模型,高维度上的分类模型也被称为超平面。
|
||||
|
||||
感知机模型如下:
|
||||
|
||||
$$f(x)=sign(w\cdot x+b)$$
|
||||
|
||||
其中$x$代表输入的特征空间向量,输出空间是{-1, +1},$w$为权值向量,$b$叫作偏置,$sign$是一个符号函数。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/7b/8f/7b0c3465dc8a590a5d59780d9dcb728f.png" alt="">
|
||||
|
||||
$w\cdot x+b=0$为超平面的方程,当感知机输出为+1表示输入值在超平面的上方,当感知机输出为-1表示输入值在超平面的下方。训练感知机模型就是要计算出$w$和$b$的值,当有新的数据需要分类的时候,输入感知机模型就可以计算出+1或者-1从而进行分类。
|
||||
|
||||
由于输出空间只有{-1, +1}两个值,所以只有误分类的时候,才会有模型计算值和样本真实值之间的偏差,偏差之和就是感知机的损失函数。
|
||||
|
||||
$$L(w,b)=-\sum_{x_{i}\in M}{y_i}({w\cdot{x_i}+b})$$
|
||||
|
||||
其中$M$为误分类点集合,误分类点越少,损失函数的值越小;如果没有误分类点,损失函数值为0。求模型的参数$w$和$b$,就是求损失函数的极小值。
|
||||
|
||||
数学上求函数的极小值就是求函数的一阶导数,但是感知机损失函数用统计求和函数表达,没办法计算解析解。机器学习采用梯度下降法求损失函数极小值,实质上就是求导过程的数值计算方法。
|
||||
|
||||
对于误分类点集合$M$,损失函数$L(w,b)$变化的梯度,就是某个函数变量的变化引起的函数值的变化,根据感知机损失函数可知:
|
||||
|
||||
$$\Delta_{w}L(w,b)=-\sum_{x_i\in M}{y_i x_i}$$
|
||||
|
||||
$$\Delta_{b}L(w,b)=-\sum_{x_i\in M}{y_i}$$
|
||||
|
||||
使用梯度下降更新$w$和$b$,不断迭代使损失函数$L(w,b)$不断减小,直到为0,也就是没有误分类点。感知机算法的实现过程:
|
||||
|
||||
1.选择初始值$w_0,b_0$。
|
||||
|
||||
2.在样本集合中选择样本数据$x_i,y_i$。
|
||||
|
||||
3.如果$y_i(w\cdot x_i+b)< 0$,表示$y_i$为误分类点,那么$w = w +\eta y_i x_i$、$b = b +\eta y_i$,在梯度方向校正$w$和$b$。其中$\eta$为步长,步长选择要适当,步长太长会导致每次计算调整太大出现震荡;步长太短又会导致收敛速度慢、计算时间长。
|
||||
|
||||
4.跳转回2,直到样本集合中没有误分类点, 即全部样本数据$y_i(w\cdot x_i+b)\geq 0$。
|
||||
|
||||
## 神经网络
|
||||
|
||||
我们现在所说的神经网络,通常是指机器学习所使用的“人工神经网络”,是对人脑神经网络的一种模拟。人脑神经网络由许多神经元构成,每个神经元有多个树突,负责接收其他神经元的输出信号,神经元细胞完成对输入信号的处理,转换成输出信号,通过突触传递给其他神经元。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/9a/eb/9a2679bdc32052da55066158d63092eb.png" alt="">
|
||||
|
||||
神经元细胞的输出只有0或者1两种输出,但是人脑大约有140亿个神经元,这些神经元组成一个神经网络,前面的神经元输出作为后面的神经元输入进一步处理,最终实现人类的智能。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/da/65/da0e437ca52544e1e1d0f72d8b682d65.png" alt="">
|
||||
|
||||
人脑神经元可以通过感知机进行模拟,每个感知机相当于一个神经元,使用$sign$函数的感知机输出也是只有两个值,跟人脑神经元一样。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/7e/0a/7e2a410a9d8c8e14ad36a61922ec050a.png" alt="">
|
||||
|
||||
$x_1,x_2,x_3$相当于神经元的树突,实现信号的输入;$sum()+b$及$sign$函数相当于神经元细胞,完成输入的计算;$y$是神经元的输出,上图用数学形式表达的话是<br>
|
||||
$$y=sign(w_1x_1+w_2x_2+w_3x_3+b)$$
|
||||
|
||||
它是感知机$y=sign(w\cdot x+b)$向量展开形式。
|
||||
|
||||
将感知机组成一层或者多层网络状结构,就构成了机器学习神经网络。下图就是一个两层神经网络。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/1d/57/1da0db29b3c5e6c0596816dec12d3757.png" alt="">
|
||||
|
||||
在多层神经网络中,每一层都由多个感知机组成。将输入的特征向量$x$传递给第一层的每一个感知机,运算以后作为输出传递给下一层的每一个感知机,直到最后一层感知机产生最终的输出结果。这就是机器学习神经网络的实现过程,通过模拟人脑神经网络,利用样本数据训练每个感知机神经元的参数,在某些场景下得到的模型可以具有不可思议的效果。
|
||||
|
||||
以神经网络实现手写数字识别为例,样本如下。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/61/f0/614f3af2bfbbdc6de5b00e10a6f6a8f0.png" alt="">
|
||||
|
||||
这个手写数字样本中的每个数字都是一个28×28像素的图片,我们把每个像素当作一个特征值,这样每个数字就对应784个输入特征。因为输出需要判别10个数字,所以第二层(输出层)的感知机个数就是10个,每个感知机通过0或者1输出是否为对应的数字。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/43/50/43cd173a4ec725cb7c192f2b41846450.png" alt="">
|
||||
|
||||
使用梯度下降算法,利用样本数据,可以训练神经网络识别手写数字,计算每个感知机的$w$和$b$参数值。当所有的感知机参数都计算出来,神经网络也就训练出来了。这样对于新输入的手写数字图片,可以进行自动识别,输出对应的数字。
|
||||
|
||||
训练神经网络的时候采用一种反向传播的算法,针对每个样本,从最后一层,也就是输出层开始,利用样本结果使用梯度下降算法计算每个感知机的参数。然后以这些参数计算出来的结果作为倒数第二层的输出计算该层的参数。然后逐层倒推,反向传播,计算完所有感知机的参数。
|
||||
|
||||
当选择两层神经网络的时候,原始感知机的$sign$函数表现并不太好,更常用的是$sigmoid$函数。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/db/88/dbbea17a001aca6eb373044573ff8988.png" alt="">
|
||||
|
||||
对于两层以上的多层神经网络,$ReLU$函数的效果更好一些。$ReLU$函数表达式非常简单
|
||||
|
||||
$$y=max(x,0)$$
|
||||
|
||||
当$x$大于0,输出$x$;当$x$小于0,输出0。
|
||||
|
||||
神经网络根据组织和训练方式的不同有很多类型。当神经网络层数比较多的时候,我们称它们为深度学习神经网络。前两年在人工智能领域大放异彩的围棋程序AlphaGo则是一种卷积神经网络。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/8c/90/8cbfe6e8542d2c0bf363fbea21638390.png" alt="">
|
||||
|
||||
对于一个19×19的围棋棋盘,在下棋过程中,每个位置有黑、白、空三种状态,将其提取为特征就是神经网络的输入(事实上,输入特征还需要包括气、眼、吃等围棋规则盘面信息)。而输出设置19×19即361个感知机产生对应的落子。然后将大量人类的棋谱,即当前盘面下的最佳落子策略作为训练样本,就可以训练出一个智能下棋的神经网络。
|
||||
|
||||
但是这样根据人类棋谱训练得到神经网络最多就是人类顶尖高手的水平,AlphaGo之所以能够碾压人类棋手还依赖一种叫蒙特卡洛搜索树的算法,对每一次落子以后的对弈过程进行搜索,判断出真正的最佳落子策略。利用蒙特卡洛搜索树结合神经网络,AlphaGo还可以进行自我对弈,不断进行自我强化,找到近乎绝对意义上的最优落子策略。
|
||||
|
||||
## 小结
|
||||
|
||||
神经网络的应用目前在大数据领域越来越广泛,很多传统机器学习模型的算法逐步尝试用神经网络代替。一般说来,传统的机器学习算法的结果是可以解释的,KNN算法的分类结果为什么是这样,贝叶斯分类的结果为什么是这样,都是可以利用样本数据和算法来解释的。如果分类效果不好,是样本数据有问题,还是算法过程有问题,也都可以分析出来。但是一般认为,神经网络计算的结果是不可解释的,为什么神经网络会分类输出这样的结果,人们无法解释;输出结果不满意,也无法找到原因,只能不断尝试。
|
||||
|
||||
神经网络中每个感知机的参数可以通过训练获得,也就是$w$和$b$可以计算得到,但是一个神经网络应该设置多少层,每层应该有多少个感知机神经元,这些参数必须要算法工程师设置,因此这些参数也被称为超级参数。超级参数如何设置目前还没有太好的方法,只能依赖算法工程师的经验和不断尝试去优化。
|
||||
|
||||
## 思考题
|
||||
|
||||
你认为强人工智能是否会出现呢?人类有一天会被机器人统治吗?
|
||||
|
||||
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。
|
109
极客时间专栏/从0开始学大数据/模块六 大数据算法/42 | 模块答疑:软件工程师如何进入人工智能领域?.md
Normal file
109
极客时间专栏/从0开始学大数据/模块六 大数据算法/42 | 模块答疑:软件工程师如何进入人工智能领域?.md
Normal file
@@ -0,0 +1,109 @@
|
||||
<audio id="audio" title="42 | 模块答疑:软件工程师如何进入人工智能领域?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/b0/34/b04463c128890913fd047df7c3864034.mp3"></audio>
|
||||
|
||||
你好,我是李智慧。在大数据算法模块,我们一起学习了几种最常用的大数据算法,包括KNN分类算法、贝叶斯分类算法、PageRank网页排名算法、关联分析Apriori算法、聚类分析K-means算法、神经网络算法以及几种常见的推荐算法,算是对大数据算法有了初步了解。
|
||||
|
||||
作为软件工程师,如果想掌握一些大数据算法的背景知识,以便更好地和算法相关团队合作,那么以这个模块讨论的算法为基础,触类旁通,针对公司使用的算法再进一步了解和学习,基本上也就够用了。但是,如果想从软件工程师深入进人工智能领域,那么就还需要系统地学习和掌握机器学习各方面的知识。
|
||||
|
||||
下面根据我的经验,给你呈现一个软件工程师进入人工智能领域的“学习路线图”,希望可以帮助到想转型进入人工智能领域的同学。
|
||||
|
||||
## 数学基础
|
||||
|
||||
机器学习有时候也被称为统计学习,其实就是统计大量历史数据中的规律,构建算法模型,再利用模型对现在的数据进行分类和预测。所以学习机器学习算法,先要复习一下统计学和概率论方面的知识。
|
||||
|
||||
很多算法的特征与函数都用向量空间表示,很多大数据算法计算也可以转化为矩阵与向量计算。比如PageRank算法就可以将网页间的链接关系表示为一个稀疏矩阵,所有页面的PageRank值构成一个向量,然后将矩阵与向量不断迭代相乘就可以了。因此,你还需要再复习一下线性代数的知识。
|
||||
|
||||
专栏前面我们讨论过机器学习的数学原理,机器学习算法的推导过程,其实就是在模型假设空间寻找使结构风险为极小值的模型,而数学上的极小值就是一阶导数为0的值,因此还需要复习一下高等数学。
|
||||
|
||||
## 机器学习算法
|
||||
|
||||
大家普遍认为,系统学习机器学习算法最好的入门级课程是斯坦福大学的[机器学习公开课](http://open.163.com/special/opencourse/machinelearning.html),这门课程由吴恩达讲授,非常经典。还有几本比较经典的书籍可以和公开课相互参照,比如周志华的《机器学习》,俗称“西瓜书”,比较通俗易懂,适合入门;李航的《统计学习方法》,偏数学一些,可以不时翻看。
|
||||
|
||||
如果只是单纯学习算法,会比较枯燥,需要不断做一些算法的编程练习,除了学习过程中的一些算法编程练习,还可以参考《集体智慧编程》这本书,书中的例子都比较实用,可以根据书中的数据和代码进行练习。这本书偏重代码和应用,很适合软件工程师进行入门练习,不过这本书缺少算法的原理分析,算法比较少也偏简单。
|
||||
|
||||
以上这些书籍或者课程基本上都是大学教材或者相似课程的难度,如果要成为机器学习算法专家,就需要自己寻找一些更专业的书籍和论文来看了,这些资料主要是以英文为主,所以也需要你有不错的英语基础。
|
||||
|
||||
## 大数据技术与机器学习框架
|
||||
|
||||
在小规模的数据集上做算法练习,用Python程序在单机上运行就可以了,但是在真正的生产环境中,需要面对海量的数据处理计算需求,这就需要用到我们专栏前面讨论过的各种大数据技术产品。各种主流大数据产品都有自己的机器学习框架与算法库,比如Hadoop上有Mahout、Spark上有MLlib,借助这些算法库和工具,可以较快速地在大数据平台上开发机器学习应用程序。
|
||||
|
||||
Mahout和MLlib主要支持传统的机器学习算法,业界还有几款比较知名的深度学习框架:TensorFlow、Caffe,Intel也开源了基于Spark的深度学习库BigDL。
|
||||
|
||||
## 人工智能应用
|
||||
|
||||
学了这么多机器学习的知识,最终的目的还是应用,业界其实不缺懂算法的专家,但是却非常短缺能够将机器学习和业务结合,产生实际价值的专家。要想实现人工智能真正落地,一方面需要懂大数据和机器学习算法,另一方面需要深入了解具体的领域知识,能够发现业务中的痛点,并能够选择最合适的算法解决这个痛点。
|
||||
|
||||
很多时候解决问题不需要多么高大上的技术和算法,很普通的算法用对地方,也能产生巨大的效果,这才是业界最短缺的,而这也正是从软件开发转型人工智能的技术人员的优势,有多年的领域开发积淀,有技术实现和验证的能力,再加上大数据和机器学习能力加持,几项结合产生化学反应,也许能在自己的企业和行业领域创造出巨大的价值。
|
||||
|
||||
根据Gantner发布的2018年人工智能技术成熟度曲线,我给你总结一下目前人工智能技术的发展状况,供你参考。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/d8/74/d86c9627ed70baac0e69c84c9f580c74.png" alt="">
|
||||
|
||||
处于上升阶段,即具有长远发展前景的人工智能技术包括:
|
||||
|
||||
<li>
|
||||
人工智能管理:根据人工智能模型和数据管理企业,包括决策权的划分、组织结构、绩效管理等。
|
||||
</li>
|
||||
<li>
|
||||
通用人工智能:目前的人工智能仅仅在相对封闭、重复的场景中适用,稍稍扩大应用范围,特别是和人类交互的时候,经常表现得非常“弱智”。但是放到更长远来看,通用人工智能,即强人工智能还是值得期待的。
|
||||
</li>
|
||||
<li>
|
||||
知识图谱:将具有各种关联关系的信息通过图的方式组织在一起,自动发现各种信息、数据、资产、商品、人、知识等各种关系并加以利用。
|
||||
</li>
|
||||
<li>
|
||||
神经形态硬件:按照神经网络神经元形态构造硬件,即“芯片大脑”。
|
||||
</li>
|
||||
<li>
|
||||
自然语言生成:根据语境语义自动生成自然语言,既可以生成各种有格式化的报告,也可以生成诗词歌赋等文艺作品。
|
||||
</li>
|
||||
|
||||
处于顶部,被众人期待,但是可能有些过热的人工智能技术包括:
|
||||
|
||||
<li>
|
||||
人工智能平台即服务:最近几年,各家云服务厂商都在加大云服务平台上人工智能的投入和宣传,百度宣布自己All in人工智能,阿里云人工智能也占据了云平台的重要板块。
|
||||
</li>
|
||||
<li>
|
||||
深度神经网络专用芯片:针对深度学习算法专门设计的芯片,拥有比GPU更好的计算性能。
|
||||
</li>
|
||||
<li>
|
||||
智能机器人:不同于工厂流水线上的工业机器人,智能机器人用于酒店、机场、餐厅、医院,与人交互,直接服务人类。
|
||||
</li>
|
||||
<li>
|
||||
语音交互:以语音识别、自然语言理解、语音合成技术为基础的语音交互技术,以智能语音客服为代表的各种聊天机器人、虚拟助理等语音交互产品。
|
||||
</li>
|
||||
<li>
|
||||
智能应用:为各种传统软件系统赋能人工智能,在ERP、CRM等各种传统应用中集成人工智能特性。
|
||||
</li>
|
||||
<li>
|
||||
图形分析:根据图形分析数据特性,发现数据聚类特性,发现孤立点,还可进行路径优化等。
|
||||
</li>
|
||||
<li>
|
||||
目标分析:通过人工智能优化决策分析,发现达成预定条件目标的首选行动方案。
|
||||
</li>
|
||||
<li>
|
||||
深度学习:应用比较广泛的是卷积神经网络和递归神经网络,在图片、语音、视频等非结构化数据处理方面有良好效果。
|
||||
</li>
|
||||
<li>
|
||||
自然语言处理:传统上自然语言处理的方法是语法与语义分析,但是现阶段越来越多使用深度学习进行自然语言处理。
|
||||
</li>
|
||||
<li>
|
||||
虚拟助理:通过语音交互的形式,为用户订票、订餐、打车等,仿佛一个虚拟的个人助理。
|
||||
</li>
|
||||
|
||||
经过泡沫洗礼,关注度下滑,进入冷静期的人工智能技术:
|
||||
|
||||
<li>
|
||||
计算机视觉:通过获取、分析现实物理世界的图片和视频,提取出有意义的信息。包括机器视觉、光学字符识别、图像识别、模式识别、人脸识别、边缘检测和运动检测等,可应用于自动驾驶、生物识别、虚拟现实各种领域。
|
||||
</li>
|
||||
<li>
|
||||
预测分析:预测将来要发生什么、将来会发生什么,主要基于回归分析、多元统计、模式匹配、预测建模等机器学习技术。很多时候,预测有一定效果,但是距人们的期望还有一定距离。
|
||||
</li>
|
||||
<li>
|
||||
自动驾驶:利用激光雷达、摄像头、GPS和地图数据等多种车载传感和定位技术,结合机器学习模型实现车辆在无人控制的情况下自动驾驶。从人工智能角度看,自动驾驶技术上应该已经趋于成熟,但是具体应用看起来还很遥远。
|
||||
</li>
|
||||
<li>
|
||||
增强现实AR:将虚拟的文本、图形、视频叠加到现实的视频上,起到增强现实的效果。在各种谍战片里,特工们戴着炫酷的AR眼镜无所不能;但在现实中,大规模商用还尚不成熟。
|
||||
</li>
|
||||
|
||||
人工智能将会引领下一次科技革命的浪潮,基本已经得到人们的普遍认可,但是越是革命性的事物,道路越是艰难;不过道路越是艰难,收获越是巨大。人工智能对我们生产生活的改造将是全方位的,不管你现在身处什么领域,总能找到和人工智能结合的机会,期待将来人工智能科技革命的浪潮中看到你的身影。
|
||||
|
||||
2019年,如果你也想进入人工智能领域,欢迎你留言和我聊聊你的想法,希望你的思考也可以帮助到更多同学。
|
Reference in New Issue
Block a user