《白话大数据与机器学习》读书随记
1. 大数据产业
大数据产业生产流程:
- 数据收集
- 数据存储
- 数据建模
- 数据分析
- 数据变现
【数据建模】是指梳理关系的梳理,并根据数据建立一定的数据计算方法和数据指标。
【数据清洗】核心思想是让数据中那些由于误传、漏传、叠传等原因产生的数据失真部分被摒弃在计算之外。
【数据分析】一个是在数据之间尝试寻求因果关系或者影响的逻辑;另一个是对数据的呈现做适当的解读。
2. 步入数据之门
只要它表达一些确定的含义,那么这种符号就可以被认为是数据。
一些符号如果想要被认定为数据,那就必须承载一定的信息。
信息是用来消除随机不定性的东西。————香农《通信的数学理论》
算法被封装成独立的函数或者独立的类,只是在一定程度上避免了重复发明轮子而已,并不代表封装好的算法也不能不假思索地使用就可以获益的东西。
商业智能(BI)技术提供使企业迅速分析数据的技术和方法,包括收集、管理和分析数据,将这些数据转化为有用的信息。
3. 排列组合与古典概型
【如何说明事件发生的独立性?】如果要避免交通事故,就要先人为制造一些无害的交通事故,造够了次数,这个月就不会再发生交通事故了,大家也可以安心上路了。这个逻辑就变得顺理成章,但事实真如此?
4. 统计与分布
加和值、平均值、标准差、加权均值、众数、中位数
欧氏距离,曼哈顿距离(Manhattan Distance)。
曼哈顿距离又被称为出租车距离。是因为像在纽约曼哈顿区这样的地区有很多由横平竖直的街道所切成的街区(Block),出租车司机计算从一个位置到另一个位置的距离,通常直接用街区的两个坐标分别相见,再相加,这个结果就是他即将开合通过的街区数量,而完全没有必要用欧氏距离来求解。曼哈顿距离的创立,与其说有很大的学术意义,不如说耕读殴打是应用意义。
- 同比:与相邻时段的同一时期相比
- 环比:直接和上一个报告期进行比较
【抽样】抽样对象要更加有代表性和分散性。
【高斯分布】高斯密度函数的函数曲线
【泊松分布】参数$\lambda$是单位时间(或单位面积)内随机事件的平均发生率。泊松分布适用的事件需要满足以下3个条件:
- 事件是一个小概率事件
- 事件的每次发生是独立的不会相互影响
- 事件的概率是稳定的
在泊松分布的例子里,可以看到一个现象,就是k每增加1,在$k$小于$\lambda$的时候,累计函数增加是很快的,而且每次增加的量比上一次增加的要多;而在$k$越过$\lambda$之后,虽然开始还在增加,但是每次增加的量比上一次增加的要少。
【伯努利分布】除了分段函数的形式,还可以写成$P(n)=p^n(1-p)^{1-n}$
5. 指标
指标的共性:数字化、易衡量、意义清晰、周期适当(除了周期不当会产生的指标波动难以解读和反馈迟钝两种问题意外,周期不当本身可能都会让指标的侦测行为没有现实意义)、尽量客观(选秀节目中,既然是主观,一个人的主观不如多个人的主观更加公平)
指标可以横向对比也可以纵向对比,但是不能斜着对比。
【复合指标】针对基础指标而言。一般是由基础指标和复合指标进行运算得到的。
6. 信息论
若信源有$m$种消息,且每个信息是以相等可能产生的,则该信源的信息量可被表示为 $I=\log_2m$.
【概率小的事件信息量大】在日常生活中,极少发生的事件一旦发生是容易引起人们关注的,而司空见惯的事件不会关注,也就是说,极少见的事件所带来的信息量大。
一个非常棒的语言表达:我们这个例子完全是一种刻舟求剑的示意而已,切莫深究。
【香农公式】$C=B\cdot\log_2(1+\frac{S}{N})$
从公式定性分析来看,带宽越大传输速度越快。
信噪比(SNR)小就影响传输,传过去的信号由于噪声信号干扰太大,传输有可能完全不成功。如果信噪比的大小能保证部分信息传输成功,而我们希望传输的信息是完整的该怎么办?只能多传几次或者在信息后面加一些校验码来做信息冗余。
- 信息越确定,越单一,信息熵越小;
- 信息越不确定,越混乱,信息熵越大。
7. 多维向量空间
在Python和Java中,向量的定义其实就可以理解成类的定义, 向量上每个不同的属性就是不同的维度;在SQL语言中,一个表的定义就是向量的定义,一个向量的实例其实就是表里的一条数据。
【冗余】冗余在IT领域里一般是指一模一样的数据存储多余一份的情况。冗余的信息,要一分为二来看,不要无端地说明一定不可行。冗余也未必全是缺点没有一丝优点。冗余信息被作为加快数据访问速度的手段应用最多的情况一般不是在一个表里设置冗余字段,而是在很多海量数据的数据仓库里把很多小粒度的数据计算成为以一天、一周、一个月作为更大粒度统计单位的冗余信息表或者指标信息表,而直接访问这些大力度的冗余数据,比直接访问最小粒度的数据进行统计效率可能快上几千倍。
【维度】维度的设置一般都有正交性。
【数据立方体】一种比较直观的大数据可视化技术。能够帮助人们在一个研究对象和3个维度(及以下)的情况下快速找到让人感兴趣的那些小数据块,快速定位“问题”所在。为了看的更细致需要切片处理。【操作】上卷(Rollup)和下钻(Drilldown)。
数据立方体,无法呈现三个维度以上的数据,所以在高维度的数据研究中,数据立方体的逻辑客观存在,但是在实际的数据挖掘和机器学习过程中,基本用不到数据立方体的可视化技术。
人类自身的机械记忆极限是5~9个对象。
8. 回归
【线性回归】利用数理统计学中的回归分析来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。表达形式为 $y=ax+b+e$,其中 $e$为误差服从均值为0的正态分布。
在高中,用划线穿点的方法来求小球的重力加速度的方法,思路本身就是使用的线性回归的方法。
【最小二乘法】在最小二乘法中,为什么求偏导得到的极值就一定是极小值呢?可以想象用直线在纸上穿点的过程,谨小慎微地穿可以找到一个误差最小的点,稍微偏一点这个误差就会很大,而且越偏越大,那么这个大的极值点是不存在的,小的极值点是存在的,也就是要求解的点。
【过拟合(Overfitting)】为了迎合所有样本向量点甚至是噪声点而使得模型描述过于复杂。【危害】描述复杂;失去泛化能力。【过拟合的原因】训练样本太小;力求“完美”。
如果穷尽所有的办法都没办法舍弃这些灶神点而又力求让这些模型覆盖这些点,那这是非常可怕的,归纳出来的模型产生很大的偏差。
【欠拟合】由于建模不当产生的误差 $e$分布太散或者太大,而产生的,出现这种情况要考虑建模是不是有欠缺考虑的地方。【欠拟合的原因】参数过少,对于训练样本向量的维度提取太少会导致模型描述的不准确;拟合不当,通常是因为拟合方法不正确。
【曲线拟合转化为线性拟合】对于多元线性回归模型求解的传统做法,仍然是想方法把它转化为标准的线性形式的多元回归模型来处理。所有的由统计而来的回归方程在自变量很大或者很小时都容易发生失真,所以回归这种模型只能用来预测和自变量统计的区间比较近的自变量对应的函数值。
从机器学习角度而言,回归算法应该算作“分类”算法。
9. 聚类
【K-mean算法】基于向量距离来做聚类。
【有趣模式】
- 易于被人们理解
- 在某种确信度上,对于新的或检验数据是有效的
- 是潜在有用的
- 是新颖的
【孤立点/离群点】离主群或者离每个群都非常远的点。
孤立点的应用和研究:银行的信用卡诈骗识别…
【层次聚类】最后形成的是一棵树的结构。层次聚类的三种策略
- Ward策略:让所有类簇中的方差最小化
- Maximum策略(completed linkage):力求将类簇之间的距离最大值最小化
- Average linkage策略:力求将簇之间的距离的平均值最小化
【密度聚类】多用在聚类形状不规则的情况下。K-means算法是用欧氏距离半径进行类簇划分,对于带拐弯的、狭长的、不规则形状的聚类效果可能就没有原型类簇的效果好。
K-Means算法的距离计算公式也是可以选择的,一般用欧氏距离比较简单,或者用曼哈顿距离。常用的距离度量方法包括欧氏距离和余弦相似度。
- 欧氏距离度量会受指标不同单位刻度的影响,所以一般需要先进行标准化或者归一化,同时距离越大,个体间的差异越大;
- 空间向量余弦夹角的相似度度量不会受到指标刻度的影响,余弦值落在区间$[-1,1]$上,值越大,差距越小。
密度聚类在样本比较多时容易看出效果。
聚类是一个非监督学习的过程,所以在聚类的过程中免不了要多尝试几次,调整参数,以找出最合理的聚类方式。
聚类质量的评估:估计聚类的趋势;确定数据集中的簇类;测量聚类的质量。
【霍普金斯统计量(Hopkins Statistics)】$H$ 是一种空间统计量,检验空间分布的变量的空间随机性,进行量化评估。
\[H=\frac{\sum_{i=1}^ny_i}{\sum_{i=1}^nx_i+\sum_{i=1}^ny_i}\] 如果整个样本空间是一个均匀的,没有聚类趋势(聚簇不明显)的空间,那么 H 应该为 0.5 左右。反之,如果是有聚类趋势(聚簇明显)的空间,那么$H$应该接近于 1。霍普金斯统计量不是一个常用的统计指标,在R语言中有一个叫做
comato
的包,其中clustering.r
这个文件里面会有源代码。
【簇数的确定】肘方法(The Elbow Method)。尝试把样本空间划分成1个类、2个类、3个类、···、n个类,要确定哪种分法最科学,在分成m个类簇的时候会有一个划分计划,在这种划分的方法下,每个类簇的内部都有若干个向量,计算这些向量的空间中心点,即计算这m个类簇各自的空间中心在哪里。在计算每个类簇中每个向量和该类簇中心的距离(大于等于0)的和。最后把m个类簇各自的距离和相加得到一个函数$var(n)$,其中n就是类簇数。
这个方法的时间复杂度可能会相当高,因为每一次尝试都要计算,可以用来做一次经验总结或者试探性的数据分析,但是在线计算时不推荐使用。而且有时候会发现这个点可能不是很好确定,这个拐点不清晰,这种时候时候适当地在计算效率和收益程度上做一个平衡即可,不必太过纠结,毕竟聚类是一个无监督学习。
在确定类簇的数量后,就可以聚类了。即使类簇数量一样,聚类也可以使用不同方法,如何确定聚类质量呢?
【测定聚类质量】一般分为"外在方法"和"内在方法"两种。外在方法适用于有明确的外在类别基准的情况,而聚类是一种无监督学习,更多是在不知道基准的情况下及逆行的,所以我们更倾向于使用“内在方法”。
【内在方法】使用轮廓系数(Silhouette Coefficient)进行度量。对于有$n$个向量的样本空间,假设它被划分为$k$个类簇,$C_i,i=1,…,k$。对于任何一个样本空间中的向量$v$来说,可以求一个$v$到被类簇中其他各点的距离的平均值$a(v)$,还可以求一个$v$到其他所有类簇的最小平均距离(即从每个类簇里挑选一个离 v 最近的向量,然后计算距离),求这些距离的平均值,得到$b(v)$,轮廓系数的定义如下
\[s(v)=\frac{b(v)-a(v)}{\max[a(v),b(v)]}\]一般而言,函数$s(v)$的结果在-1到1之间。$a(v)$表示的是类簇内部的紧凑型,越小越紧凑;$b(v)$比较大,说明包含$v$的类簇非常紧凑。 为了让聚类中的类簇划分更加合理,可以计算簇中所有对象的轮廓系数的平均值,但是计算量可能比较大,在计算时占用较多内存,使用需要谨慎。
10. 分类
分类算法是一种“有监督的学习”。
【分类】先用一部分有种种类特征的数据和每种数据归属的标识来训练分类模型。当训练完毕后,再让计算机用这个分类模型来区分新的“没见过”的只有“特征”、没有类别标识的样本,完成该样本的分类。所有的分类算法不管怎么变,都是在解决:“某样本是某对象,某样本不是某对象”的概率问题。
请注意,这里用的是概率问题的说法。
分类和回归有这么点相似,直观上认识:因变量是定量型的归纳学习称为回归,或者说是连续变量预测;预测变量是定性型的归纳学习称为分类,或者说是离散变量预测。
【贝叶斯决策理论】是统计模型决策中的一个基本方法。基本思想如下:
- 已知类条件概率密度参数表达式和先验概率;
- 利用贝叶斯转换成后验概率;
- 根据后验概率大小进行决策分类。
贝叶斯分类器通常是基于这样一个假定:给定目标值时属性之间相互条件独立。贝叶斯公式一般简写为:
\[P(A\vert B)P(B)=P(B\vert A)P(A)\]Python
中的Scikit-learn
库中虽然对朴素贝叶斯分类算法做了实现,但是对于建模针对性的问题,分别作了以下几种贝叶斯分类的变种模型封装:
- 高斯朴素贝叶斯 Gaussian Naive Bayes
- 多项式朴素贝叶斯 Multinomial Naive Bayes
- 伯努利朴素贝叶斯 Bernoulli Naive Bayes
其中,高斯朴素贝叶斯是利用高斯概率密度公式来进行分类拟合;多项式朴素贝叶斯多用于高纬度向量分类,最常用的场景是文章分类;伯努利朴素贝叶斯一般是针对布尔类型特征值的向量做分类的过程。
【信息熵】从熵的定义来看,不难看出,熵越大说明信息混乱程度越高,做切割时越复杂,要切割若干次才能完成;熵越小说明信息混乱程度越低,做切割时越容易,切割次数也就越少。
【决策树 - 剪枝法】我们可以利用“剪枝法”进行决策树的修剪,有“前剪枝”和“后剪枝”两种方法。
- “前剪枝”:提前终止树的构造;
- “后剪枝”:等树完全构造完,如建模一共使用7个字段,全都用上,这样就形成了一个7层的树,如果一个分支下分类已经比较“纯粹”,就没必要再通过其他条件分支来进行细化。
过拟的诱因之一时更重视精度的思路,欠拟合的诱因之一是更重视简洁度的思路。因此不能武断地硕过拟合不好或者欠拟合不好,而是要在方案的收益和成本之间做一个权衡。
【随机森林】并行性比较好的算法规则。
数据挖掘中的很多算法实际是一种问题处理方式或者原则,而不是针对某一个具体的问题所书写的代码。这本身也是一个哲学上的矛盾。针对性越强,深度越大,适应度就越窄;而反过来,针对性越弱,深度越小,适应度就越广。在学习数据挖掘诸多算法时应该更多注重这些适应度较宽的算法思路。【隐马尔可夫链(HMM)】隐马尔可夫链和贝叶斯信念网络的模型思维方式有些接近,区别在于,隐马尔可夫链的模型更为简化,或者可以认为隐马尔可夫链就是贝叶斯信念网络的一种特例。
每一台手机和基站之间通话都要占用通信带宽,带宽有限,所以在手机通话符合已经超过手机基站的情况下,基站就没办法分配足够的频宽(带宽)给新接入的手机用了,电话自然打不出去也打不进来。对于基站来说,通信频带肯定是有这样的局限性的,通信要保证每个接入的手机都要正常通话一般有两种方法:1)每个人使用不同的频段。2)大家轮流”说话“,把时间打碎,如一秒分成几十个小段,这样所有的手机虽然用的是同一个频率,但是大家“说话”都很紧凑,1秒钟收集到的信息压缩在几十分之一秒发过去,时间上错开,也不会有问题。还有一种更高级的协议,叫做CDMA协议(Code Division Multiple Access),中文译为码分多址协议。
【维特比算法(Viterbi algorithm)】整体的思路就是在寻找收到的上一段信息和它后面跟随的下一段信息的转移概率问题——在这段信息后最可能出现的是哪些前置内容。
分类器的研究和调整的过程是一个精度和成本平衡的过程,所以并不是不纯度越低越好。【支持向量机SVM】恰当的标准,是让类别X中与该直线最近的样本点的距离与非类别X中的样本点与该直线的距离最大。升维是SVM算法最为吸引人的部分。
【升维】所有的n维空间上线性不可分的问题都可以考虑映射到n+1维上去构造分类函数,使得它在n为空间上的投影能够将两个类别分开。这个构造过程SVM是有着通用的方法可以解决——核函数(Kernel)进行构造。
【核函数】目的很单纯,只要在当前维度空间的样本是线性不可分的,就一律映射到更高的维度上,在更高的维度上找到超平面,得到超平面方程。而在更高维度上的超平面方程并没有增加更多的维度变量,更高的这个维度只是像在解几何题里使用的辅助线而已,最后得到的方程不会增加其他维度。
【遗传算法】算法过程:
- 基因编码
- 设计初始群体
- 适应度计算(剪枝)
- 产生下一代:直接选择,基因重组,基因突变
遗传算法可以解决【背包问题】。 GA在寻找【最大值问题】时,可以初始种群扩大化或者每一代遴选增加名额,都可以使得找到最优解的概率大大增加。
11. 关联分析
支持度、置信度(有方向)
通常选择支持度和置信度都高于阈值的门限的模式作为频繁模式。
【Apriori算法】剪枝、笛卡尔乘积···
【关联度correlation】提升度(Lift)是一种简单的关联度度量,也是一种比较容易实现的统计方法。
\[Lift(A,B)=\frac{P(B\vert A)}{P(B)}\]- 相关性等于1时,事件A和事件B毫无关系;
- 相关性大于1时,A的发生促进了B的发生;
- 相关性小于1时,A的发生抑制了B的发生。
【负相关】一般来说,如果X和Y都是频繁的,但是很少或者不一起出现,那么就说X和Y时负相关的,X和Y组成的模式是负相关模式。如果X和Y组成的模式支持远远小于X的支持度与Y的支持度的乘积,那么就说X和Y是强负相关的。
12. 用户画像
对用户做“画像”,希望通过某些手段对用户做甄别,把他们分成彼此相同或者不同的人群或个体,进而区别化提供服务和进行观察分析 —— 这通常是做用户画像的核心目的所在。
与其一味地纠结用户填写的信息是不是准确,不如把目光和精力更多地投入到更“客观”的数据上,如购买记录和浏览记录,分析这些真实存在的行为要比停留在用户“主观”填写的一些数据字段有意义得多。
现在流行RTB(Real Time Bidding, 实时广告竞价)系统进行广告竞价。
在紧密型的用户画像系统中,通常会非常依赖信息反馈,因为画像本身就是为了提高产能转化率。在电商网站上,用户画像就是为了最终的用户购物引导更为有效,而引导是不是有效的验证是极短的,甚至一两天就能验证完毕 —— 画得不准大不了过两天在重新试着画一次。这种迭加的思想方式比花费很长时间只为画一个完美用户画像容易实现得多。
13. 推荐算法
推荐思路:
- 贝叶斯分类
- 利用搜索记录
网站广告位的JavaScript代码读取了浏览器的本地Cookies(通常可以用来存储浏览器上的表达信息、用户名、搜索关键词等信息)和当前页面的文本信息,并做了响应的关键词提取,最后根据这些关键词来猜测用户可能感兴趣的内容再推荐到广告位上。
【AB测试】
我们期待的不是一个高度收敛的推荐算法,而是商品种类要丰富,也就是商品的覆盖率要高,要保证它的多样性。
【余弦相似度】
余弦相似度我在这本书里面学到的一个非常有意思的概念,用法很妙,数学的美妙啊~
14. 文本挖掘
对于传统的结构化数据挖掘来说,文本挖掘更多的是对自然语言的分析,模糊性强,结构性弱,难度大,一直都是挑战的方向。
【Rocchio算法】核心思想是给每一个文档的类别都做一个标准向量 —— 也有的地方称为原型向量,然后用待分类的文档的向量和这个标准向量比一下余弦相似度,相似度越高越可能属于该分类。
【朴素贝叶斯算法】该算法关注的是文档属于某类别的概率。词向量。
【K-近邻算法】把K定为一个变量,从这个列表找出相似度最高的K篇文章,根据这K篇文章的类别分布投票决定这篇待判定的文章更像哪种分类。这种方法可以克服Rocchio算法中无法处理线性的缺陷,但是计算成本比较高。
一般来说,文章越短分类的难度越大,准确性越差。
15. 人工神经网络
神经网络有以下几个非常优秀的特点:
- 大规模并行分布式结构
- 神经网络的学习能力以及由此而来的泛化能力。
【神经网络和SVM解决问题的思路不同】在线性不可分时,SVM会映射到高维去划分超平面;而神经网络是增加输入的变量、网络的层次、输出层。
【Logistic函数】
\[f(v)=\frac{1}{1+e^{-(\omega^Tv+b)}}\]具体在每个应用里,Logistic函数 $f(t)=\frac{1}{1+e^{-mt}}$,怎么去取m值依据情况而定,如果需要边界区分非常明显,那就把m设置大一些。
【玻尔兹曼机 Boltzmann Machine】最经典的应用是用来解决货郎担问题。
玻尔兹曼因子:$e^{-\frac{E_i}{k_BT}}$
【卷积神经网络 CNN】是一种前馈神经网络,人工神经元可以响应一部分覆盖范围内的周围单元,对于大规模的模式识别都是有着非常好的性能表现的,尤其是对大规模图形图像处理效率极高。它还是一个分类器,是一种有监督机器学习的工具。基本包括两层:
- 第一层为特征提取层,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其他特征间的位置关系也随之确定下来。
- 第二层为特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。
CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式地特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。
CNN有两种和其他神经网络不同的特殊功能:局部感知;参数共享(减少参数训练复杂度的技巧)。
关于CNN:书本P250
[1]高扬, 卫峥, 尹会生. 白话大数据与机器学习[M]. 机械工业出版社, 2016.