**
**
**
一组数据的集合被称作数据集,用于模型训练的数据集叫训练集,用于测试的数据集叫测试集。一个数据集包含多条数据,一条数据包含多个属性。
**
是指机器学习通过训练集进行模型的训练之后对未知的输入的准确判断能力
**
过拟合是指在利用训练数据进行模型训练的时候,模型过多的依赖训练数据中过多的特征属性。欠拟合是指没有通过训练集达到识别的能力。
**
**
模型就是复杂的数学相关函数,只是该函数具有很多的未知的参数,通过训练集训练来确定模型中的参数,生成的已知参数的函数就是模型。
**
机器学习分为有监督学习和无监督学习,有监督学习是指训练集中有明确的标记,如下数据集:各种特征的西瓜是不是好瓜,有明确的标记。分类就是典型的有监督学习
无监督学习是指训练集中没有明确的标记,聚类就是典型的无监督学习。
**
**
考虑一个二分问题,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被 预测成正类,即为真正类(True positive),如果实例是负类被预测成正类,称之为假正类(False positive)。相应地,如果实例是负类被预测成负类,称之为真负类(True negative),正类被预测成负类则为假负类(false negative)。
TP:正确肯定的数目;
FN:漏报,没有正确找到的匹配的数目;
FP:误报,给出的匹配是不正确的;
TN:正确拒绝的非匹配对数;
列联表如下表所示,1代表正类,0代表负类:
True Positive(TP) | False Negative(FN) | |
False Positive(FP) | True Negative(TN) |
精确率(正确率)和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量。其中精度是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率;召回率是指检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率。
一般来说,Precision就是检索出来的条目(比如:文档、网页等)有多少是准确的,Recall就是所有准确的条目有多少被检索出来了,两者的定义分别如下:
Precision = 提取出的正确信息条数 / 提取出的信息条数
Recall = 提取出的正确信息条数 / 样本中的信息条数
为了能够评价不同算法的优劣,在Precision和Recall的基础上提出了F1值的概念,来对Precision和Recall进行整体评价。F1的定义如下:
F1值 = 正确率 召回率 2 / (正确率 + 召回率)
不妨举这样一个例子:
某池塘有1400条鲤鱼,300只虾,300只鳖。现在以捕鲤鱼为目的。撒一大网,逮着了700条鲤鱼,200只虾,100只鳖。那么,这些指标分别如下:
正确率 = 700 / (700 + 200 + 100) = 70%
召回率 = 700 / 1400 = 50%
F1值 = 70% 50% 2 / (70% + 50%) = 58.3%
不妨看看如果把池子里的所有的鲤鱼、虾和鳖都一网打尽,这些指标又有何变化:
正确率 = 1400 / (1400 + 300 + 300) = 70%
召回率 = 1400 / 1400 = 100%
F1值 = 70% 100% 2 / (70% + 100%) = 82.35%
由此可见,正确率是评估捕获的成果中目标成果所占得比例;召回率,顾名思义,就是从关注领域中,召回目标类别的比例;而F值,则是综合这二者指标的评估指标,用于综合反映整体的指标。
当然希望检索结果Precision越高越好,同时Recall也越高越好,但事实上这两者在某些情况下有矛盾的。比如极端情况下,我们只搜索出了一个结果,且是准确的,那么Precision就是100%,但是Recall就很低;而如果我们把所有结果都返回,那么比如Recall是100%,但是Precision就会很低。因此在不同的场合中需要自己判断希望Precision比较高或是Recall比较高。如果是做实验研究,可以绘制Precision-Recall曲线来帮助分析。
**3.2 TPR、FPR
引入两个新名词。其一是真正类率(true positive rate ,TPR), 计算公式为
TPR = TP / (TP + FN)
刻画的是分类器所识别出的 正实例占所有正实例的比例。
另外一个是负正类率(false positive rate, FPR),计算公式为
FPR = FP / (FP + TN)
计算的是分类器错认为正类的负实例占所有负实例的比例。
还有一个真负类率(True Negative Rate,TNR),也称为specificity,计算公式为
TNR = TN /(FP + TN) = 1 - FPR
**
Precision和Recall指标有时候会出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure(又称为F-Score)。
F-Measure是Precision和Recall加权调和平均:
当参数α=1时,就是最常见的F1。因此,F1综合了P和R的结果,当F1较高时则能说明试验方法比较有效。
**
3.4.1 为什么引入ROC曲线?
**Motivation1:**在一个二分类模型中,对于所得到的连续结果,假设已确定一个阀值,比如说 0.6,大于这个值的实例划归为正类,小于这个值则划到负类中。如果减小阀值,减到0.5,固然能识别出更多的正类,也就是提高了识别出的正例占所有正例 的比类,即TPR,但同时也将更多的负实例当作了正实例,即提高了FPR。为了形象化这一变化,引入ROC,ROC曲线可以用于评价一个分类器。<br />**Motivation2:**在类不平衡的情况下,如正样本90个,负样本10个,直接把所有样本分类为正样本,得到识别率为90%。但这显然是没有意义的。单纯根据Precision和Recall来衡量算法的优劣已经不能表征这种病态问题。
3.4.2 什么是ROC曲线?
ROC(Receiver Operating Characteristic)翻译为”接受者操作特性曲线”。曲线由两个变量1-specificity 和 Sensitivity绘制. 1-specificity=FPR,即负正类率。Sensitivity即是真正类率,TPR(True positive rate),反映了正类覆盖程度。这个组合以1-specificity对sensitivity,即是以代价(costs)对收益(benefits)。
此外,ROC曲线还可以用来计算“均值平均精度”(mean average precision),这是当你通过改变阈值来选择最好的结果时所得到的平均精度(PPV)。
为了更好地理解ROC曲线,我们使用具体的实例来说明:
如在医学诊断中,判断有病的样本。那么尽量把有病的揪出来是主要任务,也就是第一个指标TPR,要越高越好。而把没病的样本误诊为有病的,也就是第二个指标FPR,要越低越好。
不难发现,这两个指标之间是相互制约的。如果某个医生对于有病的症状比较敏感,稍微的小症状都判断为有病,那么他的第一个指标应该会很高,但是第二个指标也就相应地变高。最极端的情况下,他把所有的样本都看做有病,那么第一个指标达到1,第二个指标也为1。
我们以FPR为横轴,TPR为纵轴,得到如下ROC空间。
我们可以看出,左上角的点(TPR=1,FPR=0),为完美分类,也就是这个医生医术高明,诊断全对。点A(TPR>FPR),医生A的判断大体是正确的。中线上的点B(TPR=FPR),也就是医生B全都是蒙的,蒙对一半,蒙错一半;下半平面的点C(TPR
曲线距离左上角越近,证明分类器效果越好。
如上,是三条ROC曲线,在0.23处取一条直线。那么,在同样的低FPR=0.23的情况下,红色分类器得到更高的PTR。也就表明,ROC越往上,分类器效果越好。我们用一个标量值AUC来量化它。
3.4.3 什么是AUC?
AUC值为ROC曲线所覆盖的区域面积,显然,AUC越大,分类器分类效果越好。
AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
AUC的物理意义:假设分类器的输出是样本属于正类的socre(置信度),则AUC的物理意义为,任取一对(正、负)样本,正样本的score大于负样本的score的概率。
3.4.4 怎样计算AUC?
第一种方法:AUC为ROC曲线下的面积,那我们直接计算面积可得。面积为一个个小的梯形面积之和。计算的精度与阈值的精度有关。
第二种方法:根据AUC的物理意义,我们计算正样本score大于负样本的score的概率。取NM(N为正样本数,M为负样本数)个二元组,比较score,最后得到AUC。时间复杂度为O(NM)。
第三种方法:与第二种方法相似,直接计算正样本score大于负样本的概率。我们首先把所有样本按照score排序,依次用rank表示他们,如最大score的样本,rank=n(n=N+M),其次为n-1。那么对于正样本中rank最大的样本,rank_max,有M-1个其他正样本比他score小,那么就有(rank_max-1)-(M-1)个负样本比他score小。其次为(rank_second-1)-(M-2)。最后我们得到正样本大于负样本的概率为
时间复杂度为O(N+M)。
MSE: Mean Squared Error
均方误差是指参数估计值与参数真值之差平方的期望值;
MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
RMSE
均方误差:均方根误差是均方误差的算术平方根
MAE :Mean Absolute Error
平均绝对误差是绝对误差的平均值
平均绝对误差能更好地反映预测值误差的实际情况.
fi表示预测值,yi表示真实值;
SD :standard Deviation
标准差:标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组组数据,标准差未必相同。
**
不严格的说,凸优化就是在标准优化问题的范畴内,要求目标函数和约束函数是凸函数的一类优化问题。
注意:中国大陆数学界某些机构关于函数凹凸性定义和国外的定义是相反的。Convex Function在某些中国大陆的数学书中指凹函数。Concave Function指凸函数。但在中国大陆涉及经济学的很多书中,凹凸性的提法和其他国家的提法是一致的,也就是和数学教材是反的。举个例子,同济大学高等数学教材对函数的凹凸性定义与本条目相反,本条目的凹凸性是指其上方图是凹集或凸集,而同济大学高等数学教材则是指其下方图是凹集或凸集,两者定义正好相反。
**
**
**
**
**
**5.1 [
**
**
**
**
PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。
一般情况下,在数据挖掘和机器学习中,数据被表示为向量。例如某个淘宝店2012年全年的流量及交易情况可以看成一组记录的集合,其中每一天的数据是一条记录,格式如下:
(日期, 浏览量, 访客数, 下单数, 成交数, 成交金额)
其中“日期”是一个记录标志而非度量值,而数据挖掘关心的大多是度量值,因此如果我们忽略日期这个字段后,我们得到一组记录,每条记录可以被表示为一个五维向量,其中一条看起来大约是这个样子:
我们当然可以对这一组五维向量进行分析和挖掘,不过我们知道,很多机器学习算法的复杂度和数据的维数有着密切关系,甚至与维数呈指数级关联。当然,这里区区五维的数据,也许还无所谓,但是实际机器学习中处理成千上万甚至几十万维的情况也并不罕见,在这种情况下,机器学习的资源消耗是不可接受的,因此我们必须对数据进行降维。
降维当然意味着信息的丢失,不过鉴于实际数据本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低。
举个例子,假如某学籍数据有两列M和F,其中M列的取值是如何此学生为男性取值1,为女性取值0;而F列是学生为女性取值1,男性取值0。此时如果我们统计全部学籍数据,会发现对于任何一条记录来说,当M为1时F必定为0,反之当M为0时F必定为1。在这种情况下,我们将M或F去掉实际上没有任何信息的损失,因为只要保留一列就可以完全还原另一列。
上面是一个极端的情况,在现实中也许不会出现,不过类似的情况还是很常见的。例如上面淘宝店铺的数据,从经验我们可以知道,“浏览量”和“访客数”往往具有较强的相关关系,而“下单数”和“成交数”也具有较强的相关关系。这里我们非正式的使用“相关关系”这个词,可以直观理解为“当某一天这个店铺的浏览量较高(或较低)时,我们应该很大程度上认为这天的访客数也较高(或较低)”。这种情况表明,如果我们删除浏览量或访客数其中一个指标,我们应该期待并不会丢失太多信息。因此我们可以删除一个,以降低机器学习算法的复杂度。
总之,我们需要降维来提高学习的效率以及防止学习过拟合的问题。那么
问题是我们到底删除哪一列损失的信息才最小?亦或根本不是单纯删除几列,而是通过某些变换将原始数据变为更少的列但又使得丢失的信息最小?到底如何度量丢失信息的多少?如何根据原始数据决定具体的降维操作步骤?
**
既然我们面对的数据被抽象为一组向量,那么下面有必要研究一些向量的数学性质。而这些数学性质将成为后续导出PCA的理论基础。
6.2.1 内积与投影
下面先来看一个向量运算:内积。两个维数相同的向量的内积被定义为:
内积运算将两个向量映射为一个实数。其计算方式非常容易理解,但是其意义并不明显。下面我们分析内积的几何意义。假设A和B是两个n维向量,我们知道n维向量可以等价表示为n维空间中的一条从原点发射的有向线段,为了简单起见我们假设A和B均为二维向量,则,
现在我们从A点向B所在直线引一条垂线。我们知道垂线与B的交点叫做A在B上的投影,再设A与B的夹角是a,则投影的矢量长度为,其中是向量A的模,也就是A线段的标量长度。
注意这里我们专门区分了矢量长度和标量长度,标量长度总是大于等于0,值就是线段的长度;而矢量长度可能为负,其绝对值是线段长度,而符号取决于其方向与标准方向相同或相反。
到这里还是看不出内积和这东西有什么关系,不过如果我们将内积表示为另一种我们熟悉的形式:
A与B的内积等于A到B的投影长度乘以B的模。再进一步,如果我们假设B的模为1,即让|B|=1,那么就变成了:
也就是说,设向量B的模为1,则A与B的内积值等于A向B所在直线投影的矢量长度!这就是内积的一种几何解释,也是我们得到的第一个重要结论。
**6.2.2
一个二维向量可以对应二维笛卡尔直角坐标系中从原点出发的一个有向线段。例如下面这个向量:
在代数表示方面,我们经常用线段终点的点坐标表示向量,例如上面的向量可以表示为(3,2)。
不过我们常常忽略,只有一个(3,2)本身是不能够精确表示一个向量的。我们仔细看一下,这里的3实际表示的是向量在x轴上的投影值是3,在y轴上的投影值是2。也就是说我们其实隐式引入了一个定义:以x轴和y轴上正方向长度为1的向量为标准。那么一个向量(3,2)实际是说在x轴投影为3而y轴的投影为2。注意投影是一个矢量,所以可以为负。
更正式的说,向量(x,y)实际上表示线性组合:
不难证明所有二维向量都可以表示为这样的线性组合。此处(1,0)和(0,1)叫做二维空间中的一组基。
所以,要准确描述向量,首先要确定一组基,然后给出在基所在的各个直线上的投影值,就可以了。只不过我们经常省略第一步,而默认以(1,0)和(0,1)为基。
我们之所以默认选择(1,0)和(0,1)为基,当然是比较方便,因为它们分别是x和y轴正方向上的单位向量,因此就使得二维平面上点坐标和向量一一对应,非常方便。但实际上任何两个线性无关的二维向量都可以成为一组基,所谓线性无关在二维平面内可以直观认为是两个不在一条直线上的向量。
例如,(1,1)和(-1,1)也可以成为一组基。一般来说,我们希望基的模是1,因为从内积的意义可以看到,如果基的模是1,那么就可以方便的用向量点乘基而直接获得其在新基上的坐标了!实际上,对应任何一个向量我们总可以找到其同方向上模为1的向量,只要让两个分量分别除以模就好了。例如,上面的基可以变为。
现在,我们想获得(3,2)在新基上的坐标,即在两个方向上的投影矢量值,那么根据内积的几何意义,我们只要分别计算(3,2)和两个基的内积,不难得到新的坐标为。下图给出了新的基以及(3,2)在新基上坐标值的示意图:
另外这里要注意的是,我们列举的例子中基是正交的(即内积为0,或直观说相互垂直),但可以成为一组基的唯一要求就是线性无关,非正交的基也是可以的。不过因为正交基有较好的性质,所以一般使用的基都是正交的。
6.2.3 矩阵的基变换
下面我们找一种简便的方式来表示基变换。还是拿上面的例子,想一下,将(3,2)变换为新基上的坐标,就是用(3,2)与第一个基做内积运算,作为第一个新的坐标分量,然后用(3,2)与第二个基做内积运算,作为第二个新坐标的分量。实际上,我们可以用矩阵相乘的形式简洁的表示这个变换:
其中矩阵的两行分别为两个基,乘以原向量,其结果刚好为新基的坐标。可以稍微推广一下,如果我们有m个二维向量,只要将二维向量按列排成一个两行m列矩阵,然后用“基矩阵”乘以这个矩阵,就得到了所有这些向量在新基下的值。例如(1,1),(2,2),(3,3),想变换到刚才那组基上,则可以这样表示:
于是一组向量的基变换被干净的表示为矩阵的相乘。
一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果。
数学表示为:
其中是一个行向量,表示第i个基,是一个列向量,表示第j个原始数据记录。
特别要注意的是,这里R可以小于N,而R决定了变换后数据的维数。也就是说,我们可以将一N维数据变换到更低维度的空间中去,变换后的维度取决于基的数量。因此这种矩阵相乘的表示也可以表示降维变换。
最后,上述分析同时给矩阵相乘找到了一种物理解释:两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。更抽象的说,一个矩阵可以表示一种线性变换。很多同学在学线性代数时对矩阵相乘的方法感到奇怪,但是如果明白了矩阵相乘的物理意义,其合理性就一目了然了。
**
如果基的数量少于向量本身的维数,则可以达到降维的效果。但是我们还没有回答一个最最关键的问题:如何选择基才是最优的。或者说,如果我们有一组N维向量,现在要将其降到K维(K小于N),那么我们应该如何选择K个基才能最大程度保留原有的信息?
假设我们的数据由五条记录组成,将它们表示成矩阵形式:
其中每一列为一条数据记录,而一行为一个字段。为了后续处理方便,我们首先将每个字段内所有值都减去字段均值,其结果是将每个字段都变为均值为0(这样做的道理和好处后面会看到)。
我们看上面的数据,第一个字段均值为2,第二个字段均值为3,所以变换后:
我们可以看下五条数据在平面直角坐标系内的样子:
问题来了:如果我们必须使用一维来表示这些数据,又希望尽量保留原始的信息,你要如何选择?
通过上一节对基变换的讨论我们知道,这个问题实际上是要在二维平面中选择一个方向,将所有数据都投影到这个方向所在直线上,用投影值表示原始记录。这是一个实际的二维降到一维的问题。
那么如何选择这个方向(或者说基)才能尽量保留最多的原始信息呢?一种直观的看法是:希望投影后的投影值尽可能分散。
以上图为例,可以看出如果向x轴投影,那么最左边的两个点会重叠在一起,中间的两个点也会重叠在一起,于是本身四个各不相同的二维点投影后只剩下两个不同的值了,这是一种严重的信息丢失,同理,如果向y轴投影最上面的两个点和分布在x轴上的两个点也会重叠。所以看来x和y轴都不是最好的投影选择。我们直观目测,如果向通过第一象限和第三象限的斜线投影,则五个点在投影后还是可以区分的。
下面,我们用数学方法表述这个问题。
**
上文说到,我们希望投影后投影值尽可能分散,而这种分散程度,可以用数学上的方差来表述。此处,一个字段的方差可以看做是每个元素与字段均值的差的平方和的均值,即:
由于上面我们已经将每个字段的均值都化为0了,因此方差可以直接用每个元素的平方和除以元素个数表示:
于是上面的问题被形式化表述为:寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大。
**
对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了。不过对于更高维,还有一个问题需要解决。考虑三维降到二维问题。与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。
如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此,应该有其他约束条件。从直观上说,让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。
数学上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则:
可以看到,在字段均值为0的情况下,两个字段的协方差简洁的表示为其内积除以元素数m。
当协方差为0时,表示两个字段完全独立。为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。
至此,我们得到了降维问题的优化目标:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。
**
上面我们导出了优化目标,但是这个目标似乎不能直接作为操作指南(或者说算法),因为它只说要什么,但根本没有说怎么做。所以我们要继续在数学上研究计算方案。
我们看到,最终要达到的目的与字段内方差及字段间协方差有密切关系。因此我们希望能将两者统一表示,仔细观察发现,两者均可以表示为内积的形式,而内积又与矩阵相乘密切相关。于是我们来了灵感:
假设我们只有a和b两个字段,那么我们将它们按行组成矩阵X:
然后我们用X乘以X的转置,并乘上系数1/m:
奇迹出现了!这个矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是a和b的协方差。两者被统一到了一个矩阵的。
根据矩阵相乘的运算法则,这个结论很容易被推广到一般情况:
设我们有m个n维数据记录,将其按列排成n乘m的矩阵X,设C=1mXX���C=1mXXT,则C是一个对称矩阵,其对角线分别个各个字段的方差,而第i行j列和j行i列元素相同,表示i和j两个字段的协方差。
**
根据上述推导,我们发现要达到优化目前,等价于将协方差矩阵对角化:即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列,这样我们就达到了优化目的。这样说可能还不是很明晰,我们进一步看下原矩阵与基变换后矩阵协方差矩阵的关系:
设原始数据矩阵X对应的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y=PX,则Y为X对P做基变换后的数据。设Y的协方差矩阵为D,我们推导一下D与C的关系:
现在事情很明白了!我们要找的P不是别的,而是能让原始协方差矩阵对角化的P。换句话说,优化目标变成了寻找一个矩阵P,满足PCP���PCPT是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件。
现在所有焦点都聚焦在了协方差矩阵对角化问题上,由上文知道,协方差矩阵C是一个是对称矩阵,在线性代数上,实对称矩阵有一系列非常好的性质:
1)实对称矩阵不同特征值对应的特征向量必然正交。
2)设特征向量λλ重数为r,则必然存在r个线性无关的特征向量对应于λλ,因此可以将这r个特征向量单位正交化。
由上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量为,我们将其按列组成矩阵:
则对协方差矩阵C有如下结论:
其中ΛΛ为对角矩阵,其对角元素为各特征向量对应的特征值(可能有重复)。
到这里,我们发现我们已经找到了需要的矩阵P:
P是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是C的一个特征向量。如果设P按照ΛΛ中特征值的从大到小,将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y。
**
**
总结一下PCA的算法步骤:
设有m条n维数据。
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)Y=PX即为降维到k维后的数据
6.3.2 实例
这里以上文提到的
为例,我们用PCA方法将这组二维数据其降到一维。
因为这个矩阵的每行已经是零均值,这里我们直接求协方差矩阵:
然后求其特征值和特征向量,具体求解方法不再详述,可以参考相关资料。求解后特征值为:
其对应的特征向量分别是:
其中对应的特征向量分别是一个通解,c1c1和c2c2可取任意实数。那么标准化后的特征向量为:
因此我们的矩阵P是:
可以验证协方差矩阵C的对角化:
最后我们用P的第一行乘以数据矩阵,就得到了降维后的表示:
降维投影结果如下图:
**
**
上面提到的PCA是一种数据降维的方法,但是只对符合高斯分布的样本点比较有效,那么对于其他分布的样本,有没有主元分解的方法呢?<br />比如经典的鸡尾酒宴会问题(cocktail party problem)。假设在party中有n个人,他们可以同时说话,我们也在房间中一些角落里共放置了n个声音接收器(Microphone)用来记录声音。宴会过后,我们从n个麦克风中得到了一组数据![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019462235-acbffa99-415c-4262-83cd-df41de4c9f47.png#height=15&width=155),i表示采样的时间顺序,也就是说共得到了m组采样,每一组采样都是n维的。我们的目标是单单从这m组采样数据中分辨出每个人说话的信号。<br /> 将第二个问题细化一下,有n个信号源[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019462392-4bdfd578-cf07-49ec-a097-1960411f9d26.png#height=13&width=71)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610442594.png),[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019462589-90f9ae0a-cbc3-4dbf-9106-32606f5dc80a.png#height=13&width=30)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610458940.png),每一维都是一个人的声音信号,每个人发出的声音信号独立。A是一个未知的混合矩阵(mixing matrix),用来组合叠加信号s,那么<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019462779-8309ba6b-5828-4022-aa27-37921b8d2480.png#height=15&width=34)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610463857.png)<br />x的意义在上文解释过,这里的x不是一个向量,是一个矩阵。其中每个列向量是[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019462972-ea1f1f29-3672-4071-a729-1e2f5abfd3cb.png#height=14&width=15)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610472363.png),[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019463157-1fe8bf2e-39d6-40fc-baf0-a334a77d50b7.png#height=15&width=59)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610474805.png)<br /> 表示成图就是<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019463448-7424e597-8001-4e6a-876f-654112f1fae5.png#height=318&width=367)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610486658.jpg) [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019463969-9b57c714-d764-488a-ae79-fba1d53ec6ec.png#height=189&width=415)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610504790.png)<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019464378-b177ed58-c2cf-4eb1-bef9-2507add007e2.png#height=13&width=15)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610516851.png)的每个分量都由[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019464594-93a0de3d-6ad3-4bbc-8b49-8d1c29372043.png#height=13&width=15)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/20110419161052655.png)的分量线性表示。A和s都是未知的,x是已知的,我们要想办法根据x来推出s。这个过程也称作为盲信号分离。<br />令![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019464763-eeb31390-4e5f-4b1e-8a07-810f2e29cdcd.png#height=13&width=41),那么![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019464977-d6e49034-25ec-431d-9efa-3159d9e54ccf.png#height=15&width=115)<br />将W表示成<br /> ![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019465147-e239391b-2e01-4eef-adc3-04fbbfdb149f.png#height=70&width=148)<br />其中[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019465339-c7f9461c-b007-4f6c-b50a-fd0bea3952a4.png#height=13&width=37)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610546030.png),其实就是将[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019465531-56578890-c8a2-4498-b485-639c9ca03ad8.png#height=13&width=12)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610552376.png)写成行向量形式。那么得到:<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019465732-d649d901-e4b6-46b2-90c6-fbb19d1b9d25.png#height=20&width=67)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610556454.png)
**
由于w和s都不确定,那么在没有先验知识的情况下,无法同时确定这两个相关参数。比如上面的公式s=wx。当w扩大两倍时,s只需要同时扩大两倍即可,等式仍然满足,因此无法得到唯一的s。同时如果将人的编号打乱,变成另外一个顺序,如上图的蓝色节点的编号变为3,2,1,那么只需要调换A的列向量顺序即可,因此也无法单独确定s。这两种情况称为原信号不确定。<br /> 还有一种ICA不适用的情况,那就是信号不能是高斯分布的。假设只有两个人发出的声音信号符合多值正态分布,[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019465923-5dc3c32b-d734-4209-845f-1d05059ef8da.png#height=13&width=44)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610563847.png),I是2*2的单位矩阵,s的概率密度函数就不用说了吧,以均值0为中心,投影面是椭圆的山峰状(参见多值高斯分布)。因为[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019466101-79da41fa-3453-4be5-96de-1b320eac58ed.png#height=13&width=30)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610576605.png),因此,x也是高斯分布的,均值为0,协方差为[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019466261-c70bca44-74c6-4ba7-b4db-0f58e670ca96.png#height=13&width=126)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610578175.png)。<br /> 令R是正交阵[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019466428-dfe1ba1d-66c3-4a2a-88ae-7902cbf473b9.png#height=13&width=79)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610583682.png),[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019466579-fedc19a2-aeb3-4c03-a4aa-0ee6c8515353.png#height=13&width=37)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610581664.png)。如果将A替换成A’。那么[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019466728-f0572036-2706-4c0d-835f-1998c487b8e0.png#height=13&width=37)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191610596025.png)。s分布没变,因此x’仍然是均值为0,协方差[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019466902-797f65d9-5c91-4060-b35f-83f7e2a88a1f.png#height=13&width=292)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611008991.png)。<br /> 因此,不管混合矩阵是A还是A’,x的分布情况是一样的,那么就无法确定混合矩阵,也就无法确定原信号。
**
在讨论ICA具体算法之前,我们先来回顾一下概率和线性代数里的知识。<br /> 假设我们的随机变量s有概率密度函数[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019467059-99b6db23-20dd-40a2-aee3-81f0a57938aa.png#height=13&width=24)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/20110419161101877.png)(连续值是概率密度函数,离散值是概率)。为了简单,我们再假设s是实数,还有一个随机变量x=As,A和x都是实数。令[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019467292-3dc2d7ec-fe40-4905-89fd-e4257cddee00.png#height=13&width=12)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611024681.png)是x的概率密度,那么怎么求[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019467512-6fb32749-c1cb-4b4e-9507-3cd1cffb1924.png#height=13&width=12)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611025139.png)?<br /> 令[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019467678-c8b27153-d566-4ab7-8722-a8f9885bed33.png#height=13&width=41)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611038661.png),首先将式子变换成[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019467821-dd7c6585-e054-41a2-b92d-9eaee94fa4de.png#height=13&width=34)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611038628.png),然后得到[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019467978-f284de75-5d41-4982-ae8d-51207eca31cb.png#height=13&width=72)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611048562.png),求解完毕。可惜这种方法是错误的。比如s符合均匀分布的话([![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019468177-ad473baf-5fbe-4f2c-a42a-fdf1e78876c5.png#height=13&width=71)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611044940.png)),那么s的概率密度是[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019468372-7d3da10f-09d5-4a88-95b8-04f1d327c97f.png#height=13&width=96)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611058496.png),现在令A=2,即x=2s,也就是说x在[0,2]上均匀分布,可知[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019468591-4a20d5f9-5d20-4b1d-8f31-97d230815079.png#height=13&width=53)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611054874.png)。然而,前面的推导会得到[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019468794-5be4edf6-86a8-484d-9291-cbee6fad8a7d.png#height=13&width=96)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611051253.png)。正确的公式应该是<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019468950-4fdb6eac-4491-4827-8560-335942905cf8.png#height=13&width=90)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611069269.png)<br /> 推导方法<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019469170-9f27f60d-1be2-441c-a964-2a2f68373cdd.png#height=13&width=254)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611068363.png)<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019469351-6929fe95-1f8a-48c6-8bed-e3ec8d825f65.png#height=13&width=177)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611064186.png)<br /> 更一般地,如果s是向量,A可逆的方阵,那么上式子仍然成立。
**
ICA算法归功于Bell和Sejnowski,这里使用最大似然估计来解释算法,原始的论文中使用的是一个复杂的方法Infomax principal。<br /> 我们假定每个[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019469543-673783b0-d05b-4930-bf77-b2f5aee5d15b.png#height=13&width=9)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/20110419161107216.png)有概率密度[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019469738-c45514af-18a0-4d95-9c83-b9be9a35d2ad.png#height=13&width=10)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611082625.png),那么给定时刻原信号的联合分布就是<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019469906-8212d141-fa7a-48da-accf-b6ecca9e7ad4.png#height=25&width=88)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/20110419161108608.png)<br /> 这个公式代表一个假设前提:每个人发出的声音信号各自独立。有了p(s),我们可以求得p(x)<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019470101-675c9b92-d94d-4c64-a3fc-41136ec78217.png#height=25&width=185)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611096430.png)<br /> 左边是每个采样信号x(n维向量)的概率,右边是每个原信号概率的乘积的|W|倍。<br /> 前面提到过,如果没有先验知识,我们无法求得W和s。因此我们需要知道[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019470263-e3fdf416-0e9c-4f95-b36e-6b4906d09d34.png#height=13&width=27)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611098349.png),我们打算选取一个概率密度函数赋给s,但是我们不能选取高斯分布的密度函数。在概率论里我们知道密度函数p(x)由累计分布函数(cdf)F(x)求导得到。F(x)要满足两个性质是:单调递增和在[0,1]。我们发现sigmoid函数很适合,定义域负无穷到正无穷,值域0到1,缓慢递增。我们假定s的累积分布函数符合sigmoid函数<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019470427-94e93cda-5705-4613-b93a-a527ccbc54be.png#height=24&width=67)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/20110419161110791.png)<br /> 求导后<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019470617-9892e1a6-41b7-46a1-8df4-c89410743fc2.png#height=27&width=117)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611108806.png)<br /> 这就是s的密度函数。这里s是实数。<br /> 如果我们预先知道s的分布函数,那就不用假设了,但是在缺失的情况下,sigmoid函数能够在大多数问题上取得不错的效果。由于上式中[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019470762-27706bc2-acab-4c01-b37f-6e51af1389fe.png#height=13&width=24)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611112328.png)是个对称函数,因此E[s]=0(s的均值为0),那么E[x]=E[As]=0,x的均值也是0。<br /> 知道了[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019470903-e5ec6558-d7c4-45b7-8adc-b55a489a1990.png#height=13&width=24)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611119198.png),就剩下W了。给定采样后的训练样本[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019471093-6096c79e-7322-4aef-a9c2-23b3f8102faf.png#height=15&width=155)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611127736.png),样本对数似然估计如下:<br /> 使用前面得到的x的概率密度函数,得<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019471287-f8f57751-6ac1-48f0-8670-f45163269af8.png#height=49&width=280)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611126067.png)<br /> 大括号里面是[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019471493-39ca5b1d-0387-46bd-ba5d-d7cc8ede13ba.png#height=14&width=30)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611137986.png)。<br /> 接下来就是对W求导了,这里牵涉一个问题是对行列式|W|进行求导的方法,属于矩阵微积分。这里先给出结果,在文章最后再给出推导公式。<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019471670-f0b49baf-b3a3-4823-9b7a-e83bb6a490bf.png#height=15&width=111)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611131541.png)<br /> 最终得到的求导后公式如下,[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019471838-dd358cc8-16b8-42ab-98bb-67571216bf88.png#height=13&width=40)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611135968.png)的导数为[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019472009-6a69a739-f7f8-496c-928e-4e629062af7c.png#height=13&width=45)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611138443.png)(可以自己验证):<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019472254-247abcd7-bf95-45ff-8151-37e3fbe1b0ef.png#height=85&width=331)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611148344.png)<br /> 其中[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019472490-d183a8d0-fd3e-4e42-9af7-8de613fad414.png#height=13&width=7)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611155770.png)是梯度上升速率,人为指定。<br /> 当迭代求出W后,便可得到[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019472660-6554ebf7-d6ac-426e-946a-0b85b98eb84f.png#height=13&width=54)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611154308.png)来还原出原始信号。<br /> 注意:我们计算最大似然估计时,假设了[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019472911-b5ac0bb6-9b5b-4dd5-a6d3-3d5229b5023d.png#height=13&width=16)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611167622.png)与[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019473170-024b4d5f-04d2-4f26-b237-bb5916dc94c7.png#height=13&width=17)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611172224.png)之间是独立的,然而对于语音信号或者其他具有时间连续依赖特性(比如温度)上,这个假设不能成立。但是在数据足够多时,假设独立对效果影响不大,同时如果事先打乱样例,并运行随机梯度上升算法,那么能够加快收敛速度。<br /> 回顾一下鸡尾酒宴会问题,s是人发出的信号,是连续值,不同时间点的s不同,每个人发出的信号之间独立([![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019473379-1df85831-2876-4fdf-98f4-a1bc1252c34b.png#height=13&width=9)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611177142.png)和[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019473673-9f77bedb-cb0b-4b87-a5da-a36a1edf9a5f.png#height=14&width=9)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611188471.png)之间独立)。s的累计概率分布函数是sigmoid函数,但是所有人发出声音信号都符合这个分布。A(W的逆阵)代表了s相对于x的位置变化,x是s和A变化后的结果。
**
[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019474267-e39e2054-3857-4dff-8149-1fcad983e8db.png#height=204&width=416)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611202766.jpg)<br /> s=2时的原始信号<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019474710-ee9e160a-1c12-4fa3-aac7-f947ff4a62dd.png#height=191&width=416)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611212045.jpg)<br /> 观察到的x信号<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019475184-1160f1a5-03b3-4893-8f14-815caec4c4fd.png#height=173&width=416)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611234911.jpg)<br /> 使用ICA还原后的s信号<br /> 对行列式求导,设矩阵A是n×n的,我们知道行列式与代数余子式有关,<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019475656-867d1887-ebc8-4555-ae01-93ccef96014f.png#height=45&width=331)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611257254.png)<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019475812-b99891fb-4c3d-455f-b5b3-764de0e4c416.png#height=14&width=23)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611251300.png)是去掉第i行第j列后的余子式,那么对[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019476046-9398d0ce-3873-4a70-b5b5-86bbdc377317.png#height=14&width=17)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611268169.png)求导得<br /> [![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019476282-b9ae1b2b-2c98-41e5-90e2-b4a8c794efb5.png#height=42&width=422)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611275595.png)<br /> adj(A)跟我们线性代数中学的[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019476558-795a68b6-e4af-4b7b-85e4-44df3ee43807.png#height=13&width=11)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611281069.png)是一个意思,因此<br />[![](https://cdn.nlark.com/yuque/0/2021/png/8436518/1610019476752-13ff962d-7422-4e8b-81dc-ecf307be3fdd.png#height=35&width=192)](http://images.cnblogs.com/cnblogs_com/jerrylead/201104/201104191611281003.png)
**
**
**
**
**
**
**
**
**
**
**
10.4.1
10.4.2 逻辑斯谛回归和SVM的损失函数对比
**
**
**
**
**
**
回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。例如,司机的鲁莽驾驶与道路交通事故数量之间的关系,最好的研究方法就是回归。
回归分析是建模和分析数据的重要工具。在这里,我们使用曲线/线来拟合这些数据点,在这种方式下,从曲线或线到数据点的距离差异最小。我会在接下来的部分详细解释这一点。
**
如上所述,回归分析估计了两个或多个变量之间的关系。下面,让我们举一个简单的例子来理解它:
比如说,在当前的经济条件下,你要估计一家公司的销售额增长情况。现在,你有公司最新的数据,这些数据显示出销售额增长大约是经济增长的2.5倍。那么使用回归分析,我们就可以根据当前和过去的信息来预测未来公司的销售情况。
使用回归分析的好处良多。具体如下:
1. 它表明自变量和因变量之间的显著关系;
2. 它表明多个自变量对一个因变量的影响强度。
回归分析也允许我们去比较那些衡量不同尺度的变量之间的相互影响,如价格变动与促销活动数量之间联系。这些有利于帮助市场研究人员,数据分析人员以及数据科学家排除并估计出一组最佳的变量,用来构建预测模型。
**
有各种各样的回归技术用于预测。这些技术主要有三个度量(自变量的个数,因变量的类型以及回归线的形状)。我们将在下面的部分详细讨论它们。
对于那些有创意的人,如果你觉得有必要使用上面这些参数的一个组合,你甚至可以创造出一个没有被使用过的回归模型。但在你开始之前,先了解如下最常用的回归方法:
**
它是最为人熟知的建模技术之一。线性回归通常是人们在学习预测模型时首选的技术之一。在这种技术中,因变量是连续的,自变量可以是连续的也可以是离散的,回归线的性质是线性的。
线性回归使用最佳的拟合直线(也就是回归线)在因变量(Y)和一个或多个自变量(X)之间建立一种关系。
用一个方程式来表示它,即Y=a+bX + e,其中a表示截距,b表示直线的斜率,e是误差项。这个方程可以根据给定的预测变量(s)来预测目标变量的值。
一元线性回归和多元线性回归的区别在于,多元线性回归有(>1)个自变量,而一元线性回归通常只有1个自变量。现在的问题是“我们如何得到一个最佳的拟合线呢?”。
如何获得最佳拟合线(a和b的值)?
这个问题可以使用最小二乘法轻松地完成。最小二乘法也是用于拟合回归线最常用的方法。对于观测数据,它通过最小化每个数据点到线的垂直偏差平方和来计算最佳拟合线。因为在相加时,偏差先平方,所以正值和负值没有抵消。
我们可以使用R-square指标来评估模型性能。想了解这些指标的详细信息,可以阅读:模型性能指标Part 1,Part 2 .
*要点:
· 自变量与因变量之间必须有线性关系
· 多元回归存在多重共线性,自相关性和异方差性。
· 线性回归对异常值非常敏感。它会严重影响回归线,最终影响预测值。
· 多重共线性会增加系数估计值的方差,使得在模型轻微变化下,估计非常敏感。结果就是系数估计值不稳定
· 在多个自变量的情况下,我们可以使用向前选择法,向后剔除法和逐步筛选法来选择最重要的自变量。
**
逻辑回归是用来计算“事件=Success”和“事件=Failure”的概率。当因变量的类型属于二元(1 / 0,真/假,是/否)变量时,我们就应该使用逻辑回归。这里,Y的值从0到1,它可以用下方程表示。
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
ln(odds) = ln(p/(1-p))
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3….+bkXk
上述式子中,p表述具有某个特征的概率。你应该会问这样一个问题:“我们为什么要在公式中使用对数log呢?”。
因为在这里我们使用的是的二项分布(因变量),我们需要选择一个对于这个分布最佳的连结函数。它就是Logit函数。在上述方程中,通过观测样本的极大似然估计值来选择参数,而不是最小化平方和误差(如在普通回归使用的)。
要点:
· 它广泛的用于分类问题。
· 逻辑回归不要求自变量和因变量是线性关系。它可以处理各种类型的关系,因为它对预测的相对风险指数OR使用了一个非线性的log转换。
· 为了避免过拟合和欠拟合,我们应该包括所有重要的变量。有一个很好的方法来确保这种情况,就是使用逐步筛选方法来估计逻辑回归。
· 它需要大的样本量,因为在样本数量较少的情况下,极大似然估计的效果比普通的最小二乘法差。
· 自变量不应该相互关联的,即不具有多重共线性。然而,在分析和建模中,我们可以选择包含分类变量相互作用的影响。
· 如果因变量的值是定序变量,则称它为序逻辑回归。
· 如果因变量是多类的话,则称它为多元逻辑回归。
**
对于一个回归方程,如果自变量的指数大于1,那么它就是多项式回归方程。如下方程所示:
y=a+bx^2
在这种回归技术中,最佳拟合线不是直线。而是一个用于拟合数据点的曲线。
*重点:
· 虽然会有一个诱导可以拟合一个高次多项式并得到较低的错误,但这可能会导致过拟合。你需要经常画出关系图来查看拟合情况,并且专注于保证拟合合理,既没有过拟合又没有欠拟合。下面是一个图例,可以帮助理解:
· 明显地向两端寻找曲线点,看看这些形状和趋势是否有意义。更高次的多项式最后可能产生怪异的推断结果。
**
在处理多个自变量时,我们可以使用这种形式的回归。在这种技术中,自变量的选择是在一个自动的过程中完成的,其中包括非人为操作。
这一壮举是通过观察统计的值,如R-square,t-stats和AIC指标,来识别重要的变量。逐步回归通过同时添加/删除基于指定标准的协变量来拟合模型。下面列出了一些最常用的逐步回归方法:
· 标准逐步回归法做两件事情。即增加和删除每个步骤所需的预测。
· 向前选择法从模型中最显著的预测开始,然后为每一步添加变量。
· 向后剔除法与模型的所有预测同时开始,然后在每一步消除最小显着性的变量。
这种建模技术的目的是使用最少的预测变量数来最大化预测能力。这也是处理高维数据集的方法之一。
**
岭回归分析是一种用于存在多重共线性(自变量高度相关)数据的技术。在多重共线性情况下,尽管最小二乘法(OLS)对每个变量很公平,但它们的差异很大,使得观测值偏移并远离真实值。岭回归通过给回归估计上增加一个偏差度,来降低标准误差。
上面,我们看到了线性回归方程。还记得吗?它可以表示为:
y=a+ bx
这个方程也有一个误差项。完整的方程是:
y=a+bx+e (error term), [error term is the value needed to correct for a prediction error between the observed and predicted value]
=> y=a+y= a+ b1x1+ b2x2+….+e, for multiple independent variables.
在一个线性方程中,预测误差可以分解为2个子分量。一个是偏差,一个是方差。预测错误可能会由这两个分量或者这两个中的任何一个造成。在这里,我们将讨论由方差所造成的有关误差。
岭回归通过收缩参数λ(lambda)解决多重共线性问题。看下面的公式
在这个公式中,有两个组成部分。第一个是最小二乘项,另一个是β2(β-平方)的λ倍,其中β是相关系数。为了收缩参数把它添加到最小二乘项中以得到一个非常低的方差。
要点:
· 除常数项以外,这种回归的假设与最小二乘回归类似;
· 它收缩了相关系数的值,但没有达到零,这表明它没有特征选择功能
· 这是一个正则化方法,并且使用的是L2正则化)。
**
它类似于岭回归,Lasso (Least Absolute Shrinkage and Selection Operator)也会惩罚回归系数的绝对值大小。此外,它能够减少变化程度并提高线性回归模型的精度。看看下面的公式:
Lasso 回归与Ridge回归有一点不同,它使用的惩罚函数是绝对值,而不是平方。这导致惩罚(或等于约束估计的绝对值之和)值使一些参数估计结果等于零。使用惩罚值越大,进一步估计会使得缩小值趋近于零。这将导致我们要从给定的n个变量中选择变量。
要点:
· 除常数项以外,这种回归的假设与最小二乘回归类似;
· 它收缩系数接近零(等于零),这确实有助于特征选择;
· 这是一个正则化方法,使用的是L1正则化;
· 如果预测的一组变量是高度相关的,Lasso 会选出其中一个变量并且将其它的收缩为零。
**
ElasticNet是Lasso和Ridge回归技术的混合体。它使用L1来训练并且L2优先作为正则化矩阵。当有多个相关的特征时,ElasticNet是很有用的。Lasso 会随机挑选他们其中的一个,而ElasticNet则会选择两个。
Lasso和Ridge之间的实际的优点是,它允许ElasticNet继承循环状态下Ridge的一些稳定性。
要点:
· 在高度相关变量的情况下,它会产生群体效应;
· 选择变量的数目没有限制;
· 它可以承受双重收缩。
除了这7个最常用的回归技术,你也可以看看其他模型,如Bayesian、Ecological和Robust回归。
**
当你只知道一个或两个技术时,生活往往很简单。我知道的一个培训机构告诉他们的学生,如果结果是连续的,就使用线性回归。如果是二元的,就使用逻辑回归!然而,在我们的处理中,可选择的越多,选择正确的一个就越难。类似的情况下也发生在回归模型中。
在多类回归模型中,基于自变量和因变量的类型,数据的维数以及数据的其它基本特征的情况下,选择最合适的技术非常重要。以下是你要选择正确的回归模型的关键因素:
1. 数据探索是构建预测模型的必然组成部分。在选择合适的模型时,比如识别变量的关系和影响时,它应该首选的一步。
2. 比较适合于不同模型的优点,我们可以分析不同的指标参数,如统计意义的参数,R-square,Adjusted R-square,AIC,BIC以及误差项,另一个是Mallows’ Cp准则。这个主要是通过将模型与所有可能的子模型进行对比(或谨慎选择他们),检查在你的模型中可能出现的偏差。
3. 交叉验证是评估预测模型最好额方法。在这里,将你的数据集分成两份(一份做训练和一份做验证)。使用观测值和预测值之间的一个简单均方差来衡量你的预测精度。
4. 如果你的数据集是多个混合变量,那么你就不应该选择自动模型选择方法,因为你应该不想在同一时间把所有变量放在同一个模型中。
5. 它也将取决于你的目的。可能会出现这样的情况,一个不太强大的模型与具有高度统计学意义的模型相比,更易于实现。
6. 回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多重共线性情况下运行良好。
**
**
线性回归是利用被称为线性回归方程的最小平方函数对一个或者多个自变量和因变量之间关系进行建模的一种回归分析。这种函数式一个或者多个被称为回归系数的模型参数的线性组合。
在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。
回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
下面我们来举例何为一元线性回归分析,图1为某地区的房屋面积(feet)与价格($)的一个数据集,在该数据集中,只有一个自变量面积(feet),和一个因变量价格($),所以我们可以将数据集呈现在二维空间上,如图2所示。利用该数据集,我们的目的是训练一个线性方程,无限逼近所有数据点,然后利用该方程与给定的某一自变量(本例中为面积),可以预测因变量(本例中为房价)。本例中,训练所得的线性方程如图3所示。
图1、房价与面积对应数据集
图2、二维空间上的房价与面积对应图
图3、线性逼近
同时,分析得到的线性方程为:
接下来还是该案例,举一个多元线性回归的例子。如果增添了一个自变量:房间数,那么数据集可以如下所示:
图4、房价与面积、房间数对应数据集
那么,分析得到的线性方程应如下所示:
因此,无论是一元线性方程还是多元线性方程,可统一写成如下的格式:
上式中x0=1,而求线性方程则演变成了求方程的参数ΘT。
线性回归假设特征和结果满足线性关系。其实线性关系的表达能力非常强大,每个特征对结果的影响强弱可以有前面的参数体现,而且每个特征变量可以首先映射到一个函数,然后再参与线性计算,这样就可以表达特征与结果之间的非线性关系。
**
**
上面的公式的参数向量θ是n+1维的,每个参数的取值是实数集合,也就是说参数向量θ在n+1维实数空间中取值结果有无穷种可能。
那么,如何利用一个规则或机制帮助我们评估求得的参数θ,并且使得线性模型效果最佳呢?直观地认为,如果求得参数θ线性求和后,得到的结果与真实值yy之差越小越好。
这时我们需要映入一个函数来衡量表示真实值y好坏的程度,该函数称为损失函数(loss function,也称为错误函数)。数学表示如下:
这个损失函数用的是的预测值与真实值之差的平方和。如果不考虑诸如过拟合等其他问题,这就是我们需要优化的目标函数。
**
一般地,机器学习中不同的模型会有相应的目标函数。而回归模型(尤其是线性回归类)的目标函数通常用平方损失函数来作为优化的目标函数(即真实值与预测值之差的平方和)。为什么要选用误差平方和作为目标函数呢?答案可以从概率论中的中心极限定理、高斯分布等知识中找到。
**
目标函数的概率解释需要用到中心极限定理。中心极限定理本身就是研究独立随机变量和的极限分布为正态分布的问题。
中心极限定理的公式表示为:
设n个随机变量X1,X2,···,Xn相互独立,均具有相同的数学期望与方差,即,令为随机变量之和,有
称随机变量Zn为n个随机变量X1,X2,···,Xn的规范和。
它的定义为:
设从均值为μ、方差为σ2(有限)的任意一个总体中抽取样本量为n的样本,当n充分大时,样本均值的抽样分布近似服从于均值为μ、方差为σ2的正态分布。
**
假设给定一个输入样例根据公式得到预测值与真实值之间存在误差,即为。那么,它们之间的关系表示如下:
而这里假设误差服从标准高斯分布是合理的。
解释如下:
回归模型的最终目标是通过函数表达式建立自变量x与结果y之间的关系,希望通过x能较为准确地表示结果y。而在实际的应用场合中,很难甚至不可能把导致y的所有变量(特征)都找出来,并放到回归模型中。那么模型中存在的x通常认为是影响结果y最主要的变量集合(又称为因子,在ML中称为特征集)。根据中心极限定理,把那些对结果影响比较小的变量(假设独立同分布)之和认为服从正态分布是合理的。
可以用一个示例来说明误差服从高斯分布是合理的:
在例子中,根据训练数据建立房屋的面积x与房屋的售价y之间的函数表达。它的数据集把房屋面积作为最为主要的变量。除此之外我们还知道房屋所在的地段(地铁、学区、城区、郊区),周边交通状况,当地房价、楼层、采光、绿化面积等等诸多因素会影响房价。
实际上,因数据收集问题可能拿不到所有影响房屋售价的变量,可以假设多个因素变量相互独立,根据中心极限定理,认为变量之和服从高斯分布。即:
那么x和y的条件概率可表示为:
**
根据上述公式估计得到一条样本的结果概率,模型的最终目标是希望在全部样本上预测最准,也就是概率积最大,这个概率积就是似然函数。优化的目标函数即为似然函数,表示如下:
对L(x)取对数,可得对数似然函数:
由于n,σ都为常数,因此上式等价于
我们可以发现,经过最大似然估计推导出来的待优化的目标函数与平方损失函数是等价的。因此可以得出结论:
线性回归误差平方损失极小化与极大似然估计等价。其实在概率模型中,目标函数的原函数(或对偶函数)极小化(或极大化)与极大似然估计等价,这是一个带有普遍性的结论。比如在最大熵模型中,有对偶函数极大化与极大似然估计等价的结论。
那上面为什么是条件概率p(y|x;θ)呢?因为我们希望预测值与真实值更接近,这就意味着希望求出来的参数θ,在给定输入x的情况下,得到的预测值等于真实值得可能性越大越好。而θ,x均为前提条件,因此用条件概率p(y|x;θ) 表示。即p(y|x;θ) 越大,越能说明估计的越准确。当然也不能一味地只有该条件函数,还要考虑拟合过度以及模型的泛化能力问题。
**
通过观察或者求二阶导数可知,是一个凸函数,
将m个n维样本组成矩阵X:
则目标函数的矩阵形式为
凸函数有最小值,即导数为0,
令其为零,求得驻点:
若XTX不可逆,不可使用
实际中,若XTX阶过高,仍然需要使用梯度下降的方式计算数值解。
**
我们可以将函数最小值求解想象成下山操作。
一个在山顶的人的下山逻辑:
1、找到下山最快的坡度
2、沿着这个坡度走一段距离a。
3、重复1、2步骤,直到到山底
梯度下降一般分为批量梯度下降算法和随机梯度下降算法。
不同点在于重新选择梯度方向的时候,是否计算所有的样本集。
梯度下降算法的描述如下:
1) 初始化θ(随机初始化)
2) 迭代,新的θ能够使得J(θ)更小
3) 如果J(θ)能够继续减少不收敛,返回2)
4) α称为学习率
收敛条件:J(θ)不再变化、或者变化小于某个阈值
每一次迭代,改变值如下:
针对于更新值,批量梯度下降算法如下:算法复杂度O(mn)
可以看出,参数θ的值每更新一次都要遍历样本集中的所有的样本,得到新的θj,看是否满足阈值要求,若满足,则迭代结束,根据此值就可以得到;否则继续迭代。注意到,虽然梯度下降法易受到极小值的影响,但是一般的线性规划问题只有一个极小值,所以梯度下降法一般可以收敛到全局的最小值。例如,J是二次凸函数,则梯度下降法的示意图为:
图中,一圈上表示目标函数的函数值类似于地理上的等高线,从外圈开始逐渐迭代,最终收敛全局最小值。
随机梯度下降算法如下表示:算法复杂度O(n)
在这个算法中,我们每次更新只用到一个训练样本,若根据当前严格不能进行迭代得到一个,此时会得到一个,有新样本进来之后,在此基础上继续迭代,又得到一组新的和,以此类推。
批量梯度下降法,每更新一次,需要用到样本集中的所有样本;随机梯度下降法,每更新一次,只用到训练集中的一个训练样本,所以一般来说,随机梯度下降法能更快地使目标函数达到最小值(新样本的加入,随机梯度下降法有可能会使目标函数突然变大,迭代过程中在变小。所以是在全局最小值附近徘徊,但对于实际应用俩说,误差完全能满足要求)。另外,对于批量梯度下降法,如果样本集增加了一些训练样本,就要重新开始迭代。由于以上原因,当训练样本集较大时,一般使用随机梯度下降法。
下降的梯度即为导数的负数:
一个很重要的地方值得注意的是,梯度是有方向的,对于一个向量θ,每一维分量θi都可以求出一个梯度的方向,我们就可以找到一个整体的方向,在变化的时候,我们就朝着下降最多的方向进行变化就可以达到一个最小点,不管他是全局的还是局部的。
在对目标函数J(θ)求偏导时,可以用更简单的数学语言(倒三角表示梯度)进行描述:
**
**
**
介绍逻辑斯谛回归模型之前,首先看一个并不常见的概率分布,即逻辑斯谛分布。设X是连续随机变量,X服从逻辑斯谛分布是指X具有下列的分布函数和密度函数:
式中,μ为位置参数,γ>0为形状参数。逻辑斯谛的分布的密度函数f(x)和分布函数F(x)的图形如下图所示。其中分布函数属于逻辑斯谛函数,其图形为一条S形曲线。该曲线以点(μ,1/2)为中心对称,即满足
曲线在中心附近增长较快,在两端增长速度较慢。形状参数γ的值越小,曲线在中心附近增长得越快。
**
线性回归的应用场合大多是回归分析,一般不用在分类问题上。原因可以概括为以下两个:
1)回归模型是连续型模型,即预测出的值都是连续值(实数值),非离散值;
2)预测结果受样本噪声的影响比较大。
**
LR模型表达式为参数化的逻辑斯谛函数(默认参数μ=0,γ=1),即
其中作为事件结果y=1的概率取值。这里, ,y∈{1,0}, 是权值向量。其中权值向量w中包含偏置项,即
**
**1.1.4.1 [
**
**
**
**1.1.5 [
**
**
**
**
**
**
**
**
**
15.0.1
贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。
对于分类问题,其实谁都不会陌生,说我们每个人每天都在执行分类操作一点都不夸张,只是我们没有意识到罢了。例如,当你看到一个陌生人,你的脑子下意识判断TA是男是女;你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱、那边有个非主流”之类的话,其实这就是一种分类操作。
从数学角度来说,分类问题可做如下定义:
已知集合: 和,确定映射规则,使得任意有且仅有一个使得成立。其中C叫做类别集合,其中每一个元素是一个类别,而I叫做项集合,其中每一个元素是一个待分类项,f叫做分类器。分类算法的任务就是构造分类器f。
这里要着重强调,分类问题往往采用经验性方法构造映射规则,即一般情况下的分类问题缺少足够的信息来构造100%正确的映射规则,而是通过对经验数据的学习从而实现一定概率意义上正确的分类,因此所训练出的分类器并不是一定能将每个待分类项准确映射到其分类,分类器的质量与分类器构造方法、待分类数据的特性以及训练样本数量等诸多因素有关。
例如,医生对病人进行诊断就是一个典型的分类过程,任何一个医生都无法直接看到病人的病情,只能观察病人表现出的症状和各种化验检测数据来推断病情,这时医生就好比一个分类器,而这个医生诊断的准确率,与他当初受到的教育方式(构造方法)、病人的症状是否突出(待分类数据的特性)以及医生的经验多少(训练样本数量)都有密切关系。
15.0.2 贝叶斯定理
贝叶斯定理是所有贝叶斯分类算法的核心:已知某条件概率,如何得到两个事件交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A)。这里先解释什么是条件概率:
表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:。
贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。
下面不加证明地直接给出贝叶斯定理:
条件概率的乘法定理如下:
全概率公式如下:
贝叶斯公式如下:
**
15.0.4 朴素贝叶斯分类原理
朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。通俗来说,就好比这么个道理,你在街上看到一个黑人,我问你你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?因为黑人中非洲人的比率最高,当然人家也可能是美洲人或亚洲人,但在没有其它可用信息下,我们会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础。
朴素贝叶斯分类的正式定义如下:
1、设为一个待分类项,而每个a为x的一个特征属性。
2、有类别集合。
3、计算。
4、如果,则。
那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:
1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。
2、统计得到在各类别下各个特征属性的条件概率估计。即
。
3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:
因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:
根据上述分析,朴素贝叶斯分类的流程可以由下图表示:
可以看到,整个朴素贝叶斯分类分为三个阶段:
第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
第二阶段——分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。
1.4.2、估计类别下特征属性划分的条件概率及Laplace校准
这一节讨论P(a|y)的估计。
由上面看出,计算各个划分的条件概率P(a|y)是朴素贝叶斯分类的关键性步骤,当特征属性为离散值时,只要很方便的统计训练样本中各个划分在每个类别中出现的频率即可用来估计P(a|y),下面重点讨论特征属性是连续值的情况。
当特征属性为连续值时,通常假定其值服从高斯分布(也称正态分布)。即概率函数如下:
而
因此只要计算出训练样本中各个类别中此特征项划分的各均值和标准差,代入上述公式即可得到需要的估计值。均值与标准差的计算在此不再赘述。
另一个需要讨论的问题就是当P(a|y)=0怎么办,当某个类别下某个特征项划分没有出现时,就是产生这种现象,这会令分类器质量大大降低。为了解决这个问题,我们引入Laplace校准,它的思想非常简单,就是对没类别下所有划分的计数加1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的尴尬局面。
15.0.5
这个问题是这样的,对于SNS(社交网络)社区来说,不真实账号(使用虚假身份或用户的小号)是一个普遍存在的问题,作为SNS社区的运营商,希望可以检测出这些不真实账号,从而在一些运营分析报告中避免这些账号的干扰,亦可以加强对SNS社区的了解与监管。
如果通过纯人工检测,需要耗费大量的人力,效率也十分低下,如能引入自动检测机制,必将大大提升工作效率。这个问题说白了,就是要将社区中所有账号在真实账号和不真实账号两个类别上进行分类,下面我们一步一步实现这个过程。
首先设C=0表示真实账号,C=1表示不真实账号。
1、确定特征属性及划分
这一步要找出可以帮助我们区分真实账号与不真实账号的特征属性,在实际应用中,特征属性的数量是很多的,划分也会比较细致,但这里为了简单起见,我们用少量的特征属性以及较粗的划分,并对数据做了修改。
我们选择三个特征属性:a1:日志数量/注册天数,a2:好友数量/注册天数,a3:是否使用真实头像。在SNS社区中这三项都是可以直接从数据库里得到或计算出来的。
下面给出划分:a1:{a<=0.05, 0.05=0.2},a1:{a<=0.1, 0.1=0.8},a3:{a=0(不是),a=1(是)}。
2、获取训练样本
假设这里使用运维人员曾经人工检测过的1万个账号作为训练样本。
3、计算训练样本中每个类别的频率
用训练样本中真实账号和不真实账号数量分别除以一万,得到:
4、计算每个类别条件下各个特征属性划分的频率
5、使用分类器进行鉴别
下面我们使用上面训练得到的分类器鉴别一个账号,这个账号使用非真实头像,日志数量与注册天数的比率为0.1,好友数与注册天数的比率为0.2。
可以看到,虽然这个用户没有使用真实头像,但是通过分类器的鉴别,更倾向于将此账号归入真实账号类别。这个例子也展示了当特征属性充分多时,朴素贝叶斯分类对个别属性的抗干扰性。
关于对分类器的评价,首先要定义,分类器的正确率指分类器正确分类的项目占所有被分类项目的比率。
通常使用回归测试来评估分类器的准确率,最简单的方法是用构造完成的分类器对训练数据进行分类,然后根据结果给出正确率评估。但这不是一个好方法,因为使用训练数据作为检测数据有可能因为过分拟合而导致结果过于乐观,所以一种更好的方法是在构造初期将训练数据一分为二,用一部分构造分类器,然后用另一部分检测分类器的准确率。
**
**
**
**
15.0.6 算法概述
朴素贝叶斯分类有一个限制条件,就是特征属性必须有条件独立或基本独立(实际上在现实应用中几乎不可能做到完全独立)。当这个条件成立时,朴素贝叶斯分类法的准确率是最高的,但不幸的是,现实中各个特征属性间往往并不条件独立,而是具有较强的相关性,这样就限制了朴素贝叶斯分类的能力。
贝叶斯网络(Bayesian network),又称信念网络(Belief Network),或有向无环图模型(directed acyclic graphical model),是一种概率图模型,于1985年由Judea Pearl首先提出。它是一种模拟人类推理过程中因果关系的不确定性处理模型,其网络拓朴结构是一个有向无环图(DAG)。
贝叶斯网络的有向无环图中的节点表示随机变量,它们可以是可观察到的变量,或隐变量、未知参数等。认为有因果关系(或非条件独立)的变量或命题则用箭头来连接(换言之,连接两个节点的箭头代表此两个随机变量是具有因果关系,或非条件独立)。若两个节点间以一个单箭头连接在一起,表示其中一个节点是“因(parents)”,另一个是“果(children)”,两节点就会产生一个条件概率值。
例如,假设节点E直接影响到节点H,即E→H,则用从E指向H的箭头建立结点E到结点H的有向弧(E,H),权值(即连接强度)用条件概率P(H|E)来表示,如下图所示:
简言之,把某个研究系统中涉及的随机变量,根据是否条件独立绘制在一个有向图中,就形成了贝叶斯网络。其主要用来描述随机变量之间的条件依赖,用圈表示随机变量(random variables),用箭头表示条件依赖(conditional dependencies)。
令G = (I,E)表示一个有向无环图(DAG),其中I代表图形中所有的节点的集合,而E代表有向连接线段的集合,且令X = (Xi)i ∈ I为其有向无环图中的某一节点i所代表的随机变量,若节点X的联合概率可以表示成:
则称X为相对于一有向无环图G 的贝叶斯网络,其中,表示节点i之“因”,或称pa(i)是i的parents(父母)。
此外,对于任意的随机变量,其联合概率可由各自的局部条件概率分布相乘而得出:
如下图所示,便是一个简单的贝叶斯网络:
从图上可以比较直观的看出:
1. x1,x2,…x7的联合分布为
2. x1和x2独立(对应head-to-head);
3. x6和x7在x4给定的条件下独立(对应tail-to-tail)。
根据上图,第1点可能很容易理解,但第2、3点中所述的条件独立是啥意思呢?其实第2、3点是贝叶斯网络中3种结构形式中的其中二种。为了说清楚这个问题,需要引入D-Separation(D-分离)这个概念。
D-Separation是一种用来判断变量是否条件独立的图形化方法。换言之,对于一个DAG(有向无环图)E,D-Separation方法可以快速的判断出两个节点之间是否是条件独立的。贝叶斯网络有三种链接结构:
_ __形式1:head-to-head
贝叶斯网络的第一种结构形式如下图所示:
所以有:P(a,b,c) = P(a)P(b)P(c|a,b)成立,化简后可得:
即在c未知的条件下,a、b被阻断(blocked),是独立的,称之为head-to-head条件独立。
__形式2:tail-to-tail
贝叶斯网络的第二种结构形式如下图所示
有P(a,b,c)=P(c)P(a|c)P(b|c),则:P(a,b|c)=P(a,b,c)/P(c),然后将P(a,b,c)=P(c)P(a|c)P(b|c)带入上式,得到:P(a,b|c)=P(a|c)*P(b|c)。
即在c给定的条件下,a,b被阻断(blocked),是独立的,称之为tail-to-tail条件独立,对应本节中最开始那张图中的“x6和x7在x4给定的条件下独立”。
_形式3:head-to-tail
贝叶斯网络的第三种结构形式如下图所示:
有:P(a,b,c)=P(a)P(c|a)P(b|c)。
化简后可得:
即:在c给定的条件下,a,b被阻断(blocked),是独立的,称之为head-to-tail条件独立。
**
胸部疾病诊所(Chest Clinic)
假想你是Los Angeles一名新毕业的医生,专攻肺部疾病。你决定建立一个胸部疾病诊所,主治肺病及相关疾病。大学课本已经中告诉你了肺癌、肺结核和支气管炎的发生比率以及这些疾病典型的临床症状、病因等,于是你就可以根据课本里的理论知识建立自己的Bayes网。如根据如下数据信息:
美国有30%的人吸烟.
每10万人中就就有70人患有肺癌.
每10万人中就就有10人患有肺结核.
每10万人中就就有800人患有支气管炎.
10%人存在呼吸困难症状, 大部分人是哮喘、支气管炎和其他非肺结核、非肺癌性疾病引起.
根据上面的数据可以建立如下BN模型:
这样的一个BN模型对你意义不大,因为它没有用到来你诊所病人的案例数据,不能反映真实病人的情况。当诊所诊治了数千病人后,会发现课本中所描述的北美的情况与实际诊所数据显示的情况是完全不同的,实际诊所数据显示:
· 50%的病人吸烟.
· 1%患有肺结核.
· 5.5% 得了肺癌.
· 45% 患有不同程度支气管炎.
将这些新数据输入到BN模型中,才真正的获得了对你有意义的实用BN模型:
现在,看看如何在日常诊断中用该BN模型。
· 首先,应该注意到,上述模型反映了一个来诊所求医的新患者,为诊断之前我们没有这个患者的任何信息。而当我们向患者咨询信息时,BN网中的概率就会自动调整,这就是贝叶斯推理最完美、强大之处。贝叶斯网络最强大之处在于从每个阶段结果所获得的概率都是数学与科学的反映,换句话说,假设我们了解了患者的足够信息,根据这些信息获得统计知识,网络就会告诉我们合理的推断。
现在看看如何增加个别病人信息调节概率。一个女病人进入诊所,我们开始和她谈论。她告诉我们她呼吸困难。我们将这个信息输入到网络。我们相信病人的信息,认为其存在100%呼吸困难。
可以观察到,一旦病人有呼吸困难症状,三种疾病的概率都增大了,因为这些疾病都有呼吸困难的症状。我们的病人存在这样的症状,某种程度上我们会推断这三种疾病可能性比较大,也增加了我们患者有严重疾病认识的信念。
· 仔细看看推断的过程:
明显增大的是支气管炎,从 45% 到 83.4%. 为什么会有如此大的增长呢?因为支气管炎病比癌症和肺结核更常见. 只要我们相信患者有严重的肺部疾病,那最支气管炎的可能性会更大些。
病人是抽烟者的几率也会随之增大,从50% 到63.4%.
近期访问过亚洲的几率也会增大: 从1% 到1.03%, 显然是不重要的.
X光照片不正常的几率也会上涨,从11% 到16%.
知道现在我们还无法确认什么疾病困扰着我们的这个女患者,我们目前比较相信她患有支气管炎的可能性很大,但是,我们应该获得更多信息来确定我们的判断,如果我们现在就主观定了病症,她可能得的是癌症,那我们就是一个烂医生。这就需要更多信息来做最后的决定。
因此,我们按照流程依此问她一些问题,如她最近是不是去过亚洲国家,吃惊的是她回答了“是”。现在获得的信息就影响了BN模型。
· 患肺结核的几率显然增大,从 2%到 9%. 而患有癌症、支气管炎以及该患者是吸烟患者的几率都有所减少。为什么呢?因为此时呼吸困难的原因相对更倾向于肺结核。
继续问患者一些问题,假设患者是个吸烟者,则网络变为
此时注意到最好的假设仍然是认为患者患有支气管炎。为了确认我们要求她做一个X光透视,结果显示其正常。结果如下:
· 这就更加肯定我们的推断她患有支气管炎。
· 如果X光显示不正常的话,则结果将有很大不同:
注意最大的区别。结核病或肺癌增加的概率极大。支气管炎仍然是三个独立的疾病中最可能的一个,但它小于”结核或肺癌”这一组合的假设。所以,我们将决定进行进一步测试,血液测试,肺组织活检,等等。我们当前的贝叶斯网不包括这些测试,但它很容易扩展,只需添加额外的节点作为我们获得新的统计数据的诊断程序。我们不需要扔掉以前的任何部分。这是贝叶斯网的另一个强大的功能。他们很容易扩展(或减少,简化),以适应不断变化的需求和变化的知识。