利用回归预测数值型数据
线性回归
前面讲的都是监督学习中的分类,训练出可以判断样本类别的模型,而回归的目的是预测数值型的目标值,最直接的办法是依据输入写出一个目标值的计算公式,将自变量代入后就能根据函数得到因变量的预测值。
先讲最简单的回归方法:最小二乘法。
我们被给予二维平面内的一系列点,我们希望画出一条直线,根据直线的方程(回归方程)能够以较小的误差预测点所在的位置。
仍然按照前面提到过的思考方法,最小二乘法模型的优化目标是什么?希望回归方程的预测目标值与真实目标值之差的平方和最小。那最小二乘法的损失函数的是什么?平方损失函数,表达式如下:
那用什么方法去优化目标函数?我们先将目标函数改为矩阵表示,再对w
求导,令其导数为零,然后解得w
如下:
w
上方的小标记表示那是w
的最佳估计值,可能不是真实值。上面的公式中还用到了X
的逆矩阵,所以这个方程只在X
存在逆矩阵的时候适用。计算出w
就得到了回归直线,下图是示例:
不过看上图的样本点似乎还有更好的拟合方式。最小二乘法这样纯粹的线性回归往往会出现欠拟合现象,所以我们期望在估计中引入一些偏差,从而降低预测的均方误差。
下面讲的是局部加权线性回归(LWLR),它的思想在于,我们给所有的样本点赋予一定权重,并且认为离待预测点更近的样本点所拥有的权重应该更高。
这样解出回归系数w
的形式如下:
式子中的W
是一个矩阵,为每个数据样本点赋予一定权重。那W
怎么确定?怎样实现离待预测点更近则权重越高呢,这里我们使用核函数,与SVM中的核函数类似,高斯核是比较常用的一种核,对应的权重公式如下:
这样就满足了离待预测样本点越近,权重越高的要求,k
是需要我们设置的参数,它用来调节『权重值在近样本点的集中程度』:
k
越小,权重值就越集中在近的样本点。k
越大,权重分布就越分散。
通过最小二乘法和局部加权线性回归的回归系数w
求解公式可以发现我们都需要求X'X
的逆矩阵,如果训练样本的特征比样本数还多,或者某些列之间存在着线性相关关系,都会导致X
不再是列满秩矩阵,进而导致X'X
的行列式近乎为0,也即X'X
近乎为奇异矩阵、非满秩矩阵、不可逆矩阵,如果对这样的X'X
求逆矩阵,就会找不到最优解或者误差很大。为了解决这样的情况,我们引入几种缩减方法,第一个介绍『岭回归』。
岭回归就是在原来最小二乘法式子求逆之前先加上一个阶数与样本数相同的对角矩阵,也即加上一个正则项,使矩阵为奇异的风险大降低,损失了无偏性,来换取高的数值稳定性。计算公式如下:
λ
是常数,I
是主对角线元素全为1的单位矩阵。在原有基础上加上正则项后,还可以在样本数过少的时候对系数进行惩罚,限制了所有w
之平方和(系数越大、模型越复杂,越容易过拟合),防止过拟合,提高了泛化能力。为什么说系数越大越容易过拟合,因为系数往往是函数求导后的式子中所包含的,系数越大,则整个函数的导数越大,导数越大,整个模型就越有可能做一些激烈的变化去拟合所有的点,我们控制系数大小,即控制了整个函数导数的大小,使得曲线相对平滑,防止了过拟合,也就有了更高的泛化能力。
所以当λ
比较小时,系数与普通回归一样,而λ
非常大时,所有回归系数缩减为0,我们在中间某处选择一个合适的λ
值,使得预测结果最好。
实际上,岭回归通过增加正则项,就是为最小二乘法增加了这样的约束条件:
除了岭回归,还有一种缩减方法叫做lasso,只不过它的约束条件是这样:
用绝对值取代了平方和,虽然变化非常细微,但计算复杂度却大大增加了,我们要介绍一个更简单的方法,叫做『前向逐步回归』。
前向逐步回归是一种贪心算法,一开始所有的系数的权重都为1,然后每一步都是对某个权重增加或减少一个很小的值。
首先固定其他特征,只看第一个特征,看系数值是增加好还是减小好,处理完成后再处理第二个特征,不断循环往复,处理完全部特征了再从第一个特征重新开始处理,一直到系数都稳定下来。
树回归
上一节介绍了多种线性回归算法,但是对于某些复杂的数据集,并不能建立全局的回归方程,所以我们希望结合树的思想,先将数据集进行分类,将数据集切分成很多份易建模回归的数据,然后再用前面的回归方法来求得回归方程。
前面我们讲过ID3决策树算法,在那里我们一次分类就要消耗一个特征,在后面的分类过程中,这个被消耗掉的分类就不再起作用,这样的分类有时候太过迅速,浪费了一些信息,而且ID3决策树也只能处理离散型的数据,如果要处理连续性数据需要先经过一步预处理,但是这种处理会破坏连续性数据原本的内在性质。
为了解决前面提到的问题,我们介绍CART树(分类回归树)构建算法,它利用二元切分法处理连续型变量,即每次把数据切为两份,分别进入左子树和右子树。基于CART可以构建回归树,也可以构建模型树。
回归树概要,加载数据集,随后选定最好的划分特征和划分特征值,将原数据集划分成左子树和右子树,随后不断迭代划分,直到满足停止条件。当回归树构建完成后,我们用每个叶子节点数据的均值来代表这个叶子节点下的所有数据。
构建回归树的过程与ID3算法构建树的过程非常相似,接下来需要确定的是两点,一个是在构建回归树的过程中怎样选定最好的划分特征和划分特征值,第二个是应该用什么作为提前停止条件。
在ID3算法中,我们每次选择让整个数据集香农熵减小最多(信息增益最大)的特征对数据集进行划分,而在回归树算法中因为要处理的是连续性的数值变量,直接采用总方差来度量分类的有效程度,遍历所有特征及其所有可能的取值,每次选择让整个数据集总方差减小最多的特征及划分特征值对数据进行划分。
回归树算法中需要提前设定两个参数以控制算法的停止时机,一个是容许的误差下降值,一个是切分的最少样本数。也就是如果这次最佳划分使总方差的下降值小于预定阈值,或划分后的两个子集存在某个子集大小小于预定阈值,则停止继续划分。
使用CART构建树时还会涉及到树剪枝的问题,一棵树如果节点过多,表示该模型可能对数据进行了过拟合,我们可以通过交叉验证来判断是否发生了过拟合,通过降低决策树复杂度来避免过拟合的过程称为剪枝,提前终止条件实际上就是预剪枝,另一种形式的剪枝需要使用训练集和测试集,称作后剪枝。
如果使用预剪枝,我们需要不断的修改停止条件,而后剪枝则不需要用户指定参数,但相对的,后剪枝不如预剪枝有效。
后剪枝需要在树构建完成后使用测试集,自上而下找到叶节点,然后尝试合并相邻的叶节点,如果合并叶节点后能够降低在测试集上的误差,那我们就合并掉两个叶节点。
接下来要讲的是模型树,模型树与回归树的区别在于,每个叶子节点下不再是常数,而是用线性函数来对数据做拟合,整棵模型树成为了一个分段线性函数。
比如上图这样的数据就相当适合采用模型树来建模,整个数据集会被分为两个叶子节点,每个叶子节点下是一个线性函数。
其划分的基本思想仍然是找让整个数据集总误差最小的划分方式,回归树中的方法不能再用,但是我们在上一节讲过了相当多的线性模型,也讲过了它们对应的计算误差的方式(平方误差),我们只要在每次尝试划分后对每个叶子节点下用线性模型去拟合该节点下的数据,然后分别计算误差值,选取使总误差最小的划分方式即可。
树回归在预测复杂数据集时会比简单的线性模型更有效。
无监督学习
前两部分讲的都是有监督学习,所做的大多是:『对于输入数据X能预测变量Y』,而无监督学习要回答的问题是:『从数据X中能发现什么』。
K-均值聚类算法
一句话概要,首先,选择k个初始点作为质心,然后为每个样本点找距其最近的质心,并将其分配给该质心所对应的簇,然后将每个簇的质心更新为该簇所有点的平均值,既然质心位置改变了,那对样本点的划分自然也要随之改变,如此不断迭代,直到对所有样本点的分类都不再改变,也即算法收敛。
既然存在质心的概念,就要使用某种距离度量方式计算,我们当然可以用欧式距离公式,也可以利用余弦距离,根据两者夹角的大小表示距离的大小。
这里我举一个利用K-均值聚类算法进行文本分类的例子,类似于前面的朴素贝叶斯算法,我们为每篇文档建立一个词向量,只不过用的既不是词袋模型也不是词集模型,首先去掉单词表中的所有的停用词,之后每个词的对应位置放置的,是这个词在这篇文档当中的TF-IDF值,若该词在该文档中所占比例越大,则其TF值越大,而若该词在所有文档中的出现比例越高,则其IDF值越小,最后计算其TF*IDF的值(TF-IDF值),作为该词表示所在文档主题的能力。这样我们就得到了每篇文档的词向量,随后走K-均值聚类算法的流程,先给出若干随机向量,对全部文档进行第一次分类,这里的距离度量方式采用的就是余弦距离,通过判断两个向量夹角的余弦值来描述两者间的距离关系,若其夹角为0度,则余弦值为1,若其夹角为180度,则余弦值为-1,认为夹角余弦值越大则两篇文档越相近,越小则两者越无关。
接下来我们要谈一下K-均值聚类算法所存在的问题,首先K值是由用户定义的,很多时候用户并不知道要将K设置成多少,而且又因为其初始质心的设置是依靠随机生成,所以K-均值算法会收敛到局部最小值而不是全局最小值。
我们通过SSE(误差平方和)来度量聚类效果,SSE值越小说明数据点越接近它们对应的质心,我们当然可以通过增加簇的个数来降低SSE,但这违背了我们聚类的目标,我们希望在保持簇数目不变的情况下提高簇的质量。
我们可以采用这样的后处理来提高K-均值聚类算法的聚类质量:首先将SSE值最大的簇拆分成两个簇,具体方法可以是对该簇内的数据运行K-均值聚类算法,同时将K设置为2,而且,为了保证总的簇数不变,我们还要将两个质心合并,我们可以选择合并两个最近的质心,或者合并两个使得SSE增幅最小的质心。
为了克服K-均值聚类算法可能会收敛到局部最小值的问题,有人提出了二分K-均值算法,一句话概要,该算法首先将所有点作为一个簇,然后将该簇一分为二,之后选择其中一个簇继续进行划分,选择哪个簇取决于对其划分是否可以最大程度降低SSE值(是不是与构建树的过程有些相似),上述基于SSE的划分过程不断重复,直到得到用户指定的簇数目为止。
使用Apriori算法进行关联分析
一句话概要,Apriori算法首先根据所给数据构建只有一个元素的项集,然后判断每个项集的支持度,去掉支持度不足的项集,再组合一元素项集构建二元素项集,再去掉支持度不足的项集,如此不断迭代,直到不存在拥有更多元素的频繁项集。之后是发现关联规则,关联规则产生于频繁项集,一个频繁项集可以生成多条可能的关联规则,我们利用分级法,先生成右边只有一个元素的关联规则,然后判断每条规则的可信度,去掉可信度不足的规则,再将可信度足够的规则拆分子集,生成右边有两个元素的关联规则,再去掉可信度不足的规则,如此不断迭代,直到不存在右侧有更多元素的关联规则。
关联分析包括发现频繁项集和关联规则,频繁项集是经常出现在一块的物品的集合,关联规则暗示两种物品之间可能存在很强的关系,而且这种关系是有方向性的,A->B和B->A是两条不同的关联规则。
然后定义支持度与可信度,支持度用来描述频繁项集,可信度用来描述关联规则。一个项集的支持度被定义为数据集中包含该项集的记录所占的比例。如果一共有10条记录,5条记录中出现了A,那A的支持度就是1/2;如果3条记录中同时出现了AB,那AB的支持度就是3/10。可信度是针对由A->B这样的关联规则来定义的,可信度的计算基于支持度,上例中,A->B的可信度就是AB的支持度3/10除以A的支持度1/2,等于3/5;如果要计算B->A的支持度,那除以的就应该是B的支持度。
上面提到,我们只用支持度足够的一元素项集构建二元素项集,这里用到了一个简单的原理,如果这个一元素项集的支持度未达到阈值,那所有包含该元素的多元素项集的支持度也不可能达到阈值,这个很好理解,因为包含该元素的每个多元素项集的出现次数都不可能高于该元素的出现次数。
另外,如果某项集本身不是频繁项集,那由该项集生成出来的关联规则,在计算上确实是有可能有足够可信度的,比如A、B、AB均只出现了一次,那A->B,B->A的可信度都是100%,但我们不选择采信该关联规则,因为数据量太小。
上面还提到,我们只选择拆分可信度足够的关联规则来找更进一步的关联规则,这里同样用到一个原理,如果某条规则不满足最小可信度要求,那该规则的所有子集也不可能满足最小可信度的要求。
举个例子,我们找到一个频繁项集0123,首先它可以生成这样4条关联规则:123->0、023->1、013->2、012->3。如果012->3这条关联规则的可信度不够,则12->03、02->13、01->23这三条关联规则也不可能达到足够的可信度。因为如果012->3这条关联规则的可信度不够,那么表示0123的支持度/012的支持度已经不能满足可信度需求,而01、02、12的支持度必然大于012的支持度,这种条件下,可信度计算公式的分子不变而分母增大,总可信度必然是减小的,所以更不可能高于可信度的最小阈值。既然12->03、02->13、01->23不满足可信度要求,那就更不要说2->013、1->023、0->123了,证明同理。这种根据频繁项集找关联项集的方式也被叫做分级法。
FP-growth算法发现频繁项集
一句话概要,FP指频繁项集(Frequent Pattern),FP-growth专门用来发现频繁项集,速度快于Apriori,只扫描数据集两次,一次构建FP树,一次从FP树中挖掘频繁项集。常被用来做输入联想,比如在百度搜索框里输入『为什么』,就会联想出一些有意思的东西。
FP-growth速度快于Apriori,因为Apriori对于每个潜在的频繁项集都会扫描一遍数据集来判定其支持度是否达到要求。FP-growth只扫描数据集两次,一次构建FP树,一次从FP树中挖掘频繁项集。
那什么是FP树?FP树通过链接来连接相似元素,被连起来的元素项可以看成一个链表,示例如下:
同搜索树不同的是,一个元素项可以在一棵FP树中出现多次。FP树会存储项集的出现频率,而每个项集会以路径的方式存储在树中。存在相似元素的集合会共享树的一部分。只有当集合之间完全不同时,树才会分叉。树节点上给出集合中的单个元素及其所在序列中的出现次数,路径会给出该序列的出现次数。
上面的FP树就是由下面的数据集生成的,一点点来分析,z
一共出现了5次,其中zr
(不包括zxyrt)出现1次,zxyrt
出现1次,zxyst
出现2次,这样加起来,z
出现了4次,看数据,发现z
还单独出现了1次,所以一共5次。r
一共出现了3次,是将3条路径(zr
、zryrt
、xsr
)中的r
出现次数相加。其实我们还可以发现,原数据当中还有一些h
、j
、p
、v
、u
、o
、q
、e
、m
没有在FP树中出现,这里也同样引入了支持度的概念,数据集中出现次数小于3次的字母不被放入树中。
第一次遍历数据集会获得每个元素项的出现频率,接下来过滤掉不满足最小支持度的元素项,之后对数据集中的每条数据按照元素项的绝对出现频率来排序。在构建时,读入每个项集并将其添加到一条已经存在的路径中,如果该路径不存在,则创建一条新路径。除此之外,我们还要建立一个头指针表用来保持对每个满足最小支持度字母的引用。至此,就完成了FP树的构建。
之后要做的是从FP树中挖掘频繁项集,挖掘频繁项集分为三个步骤:从FP树中获取条件模式基、利用条件模式基构建一个条件FP树、迭代直到树包含一个元素项为止。
首先是查找条件模式基,条件模式基是以所查找元素为结尾的路径集合,通俗的来讲也就是前缀路径,一条前缀路径是介于所查找元素与树根节点之间的所有内容。我们可以先通过前面的头指针表找到每个频繁项每个元素项的位置,再向前上溯这棵树直到根节点为止,以此来找到所有的前缀路径,也就是条件模式基。
下面是每个频繁项的条件模式基实例:
大括号里面的,是该条前缀路径上的所有节点,z
前面没有别的节点,所以大括号中为空,大括号后面的数字代表了这条前缀路径的出现次数。
接下来我们要做的是根据条件模式基构建条件FP树,条件FP树的构建与FP树的构建非常相似,区别在于,条件FP树是针对某个频繁项来讲的,我们在上一步中已经找到了每个频繁项的条件模式基,构造该频繁项的条件FP树所使用的数据,就只是该频繁项所对应的条件模式基,也就是说构造初始FP树,我们用的是所有的数据,构建每个频繁项的条件FP树,我们只用这个频繁项的条件模式基。当然,构造条件FP树时,也需要先排序然后去掉不满足最低支持度的项,因为即便某项在全部的数据中是频繁项,但在某频繁项的条件模式基中却不一定是频繁项了。
接下来再对构建的条件FP树去抽取条件模式基,再迭代构建条件FP树,直到条件树中没有元素为止,如此我们就能得到所有的频繁项集。
其他工具
利用PCA与SVD来简化数据
PCA是主成分分析的简写,实际上就是将N维数据降维到最能代表数据集真实结构的K个正交维度上去(N>K),且这K个维度是重新构造而成的,而不是从原有N维中选取,这K维特征被称为主成分。其价值在于四点:使数据集更容易使用、降低很多算法的计算开销、去除噪声、使结果易懂。
PCA对数据进行降维,我们要把高维度的数据去除噪声,只保留最重要的N个维度,那怎么确定需要保留的维度呢?第一个维度选择的是原始数据中方差最大的方向,通俗的讲,就是给定大量数据点,我们画出一条直线,尽可能的经过这些点,这条直线的方向就是方差最大的方向(下面会给出示例图)。接下来要找第二个维度,对第二个维度有这样的要求,它需要与第一个维度正交,我们要在与第一个坐标轴正交的所有坐标轴里找到方差最大的方向作为第二个坐标轴,第三个坐标轴同理,它需要与前两个坐标轴均正交。
原理如上文所讲,那具体如何处理呢?这里会涉及到协方差矩阵的概念,首先,方差和标准差是用来描述一维数据的,而如果我们想要处理多维数据,发现两维数据之间的相关关系,就要用到协方差矩阵,我们依照方差公式类比推得协方差公式。
若协方差的结果为正值,则说明两者正相关;若为负值,则说明两者负相关;为零则说明不相关,相互独立。
上面的协方差公式只能处理二维问题,那我们要处理多维之间的相关关系,那自然该想到使用矩阵表示,由协方差组成的协方差矩阵。
接下来,我们求这个协方差矩阵的特征值,选择保留K个最大的特征值,这K个特征值所对应的特征向量也就给出了K个最重要的真实结构,而且协方差矩阵是对称阵,其特征值对应的特征向量都是相互正交的,满足作为相互独立坐标轴的条件,我们可以通过将原数据乘以这K个特征向量将其转化到新空间。
而且我们其实还发现了一点,PCA方法中特征值最大的那个特征向量的方向(投影到该坐标轴后数据集总方差最大的方向),实际上也就是我们用最小二乘法对数据集进行拟合所得到的线性回归直线的方向,这个是可以证明的,最小二乘法目标函数的优化目标实际上就是找到数据集协方差矩阵(X'X
)的最大特征值,而最大特征值对应的特征向量也就是最小二乘法的回归直线。
PCA将N个特征降维到K个,所以可以用来进行数据压缩,例如100维的向量最后可以用10维来表示,那么压缩率为90%。
SVD是奇异值分解的简称,SVD同样是将高维数据降低到低维,或者理解成在噪声数据中抽取相关特征。
SVD的应用非常广,其中一个就是隐性语义索引,SVD可以抽取文档和词的概念,也就是可以识别拥有同一主题的文章以及同义词。举个例子,如果我们要根据某个关键词找出包含它的文章,如果文档中的该词包含了错别字,或者使用的是该词的同义词,只基于词语存在与否的搜索是无法找到这样的文章的,但是使用SVD就可以做到。
SVD的另一个应用就是推荐系统,简单的推荐系统直接用余弦距离等计算项或者人之间的相似度,更先进的方法则先利用SVD从数据中构建出一个主题空间,然后再在该空间下计算相似度。对于原始数据矩阵进行SVD处理就能将数据压缩到若干概念中去。
接下来先讲SVD的推导过程,再根据原理更深入的讲应用过程,推导过程有些复杂。
在推理SVD之前,先做一步EVD推理,SVD是奇异值分解,EVD是特征值分解,这里我们选择一种特殊的矩阵,也就是对称阵,前面我们也提到过对称阵有种性质,就是它的特征向量相互正交,或者讲可以构成一组正交基。
首先假设我们有一个满秩对称阵A
,它的特征值是λ
,相应的单位特征向量是x
,假设一共有m
个特征值。则根据特征值、特征向量的定义,下式成立:
将上式以矩阵形式表示:
两侧同时右乘U
的逆矩阵得(因为U
为正交阵,其逆矩阵等于其转置):
假设我们现在要将一个新的向量x
转化到A
所在的列空间之中,也即如下式:
由于上文中讲,A
为对称阵,x
为它的单位特征向量(旧x
),所以x
为一套正交基,所以我们就可以把新x
这个向量用旧x
这套正交基表示:
所以得到下式:
紧接着,中间的对角阵与右边的a
(也就是A
的特征向量们)相乘,实际上就是对a
在各个维度上进行拉伸或压缩:
由上图,如果A
不满秩,也就是A
存在为零的特征值,那么中间的对角阵对角线上就存在零元素,这时候就会导致维度退化,映射后的向量会落在m维空间的子空间之中。
最后一个变换就是U
对拉伸或压缩后的向量做变换,由于U
和U'
是互为逆矩阵,所以U
变换是U'
变换的逆变换。
因为U
和U'
里面的是A
的特征向量们,是一组正交基,对其拉伸压缩后,向量之间仍然正交,所以实际上,A
可以起到将一组正交基转化到另一组正交向量的作用。
接下来要分析的是,对于任意一个M*N的矩阵A
,A
矩阵将N维空间中的向量映射到K(K<=M)维空间中(K是矩阵A
的秩),现在的目标是,找到这样一组正交基,经过A
变换后仍然是正交的。假设,已经找到这样一组v
:
经过A
映射后,将其映射为:
如果要使它们两两正交,即:
根据假设,存在:
所以如果我们将v
选择为A'A
的特征向量的话,因为A'A
是对称阵,所以v
之间两两正交,λ
是A'A
的特征值,那么:
所以我们就找到了一组正交基,经过A
变换之后仍然是正交的。
接下来我们将其单位化,因为:
所以:
单位化:
可得:
接下来:
从而:
即得:
SVD的核心原理,就是任意一个M*N的矩阵A
,都能被拆分成M*M的正交阵U
、M*N的对角阵Σ
、N*N的正交阵V'
的乘积。V
是A'A
的特征向量矩阵,Σ
是A'A
的奇异值矩阵,至于U
,每个Ui
都是由A*Vi
并单位化(除以对应奇异值)后得出的。
而且如果A
不满秩,那利用矩阵分块乘法就能对式子进行化简,就能找到A
对应的满秩分解,A=XY
,X
是M*K,Y
是K*N,K为A
的秩。
前面讲了原理,下面讲SVD的应用,其实SVD除了基础应用之外还有拓展出来的RSVD与SVD++,这里不讲。
SVD的第一个用途是用来简化数据(或者讲去除噪声),前面说的满秩分解实际上就是将M*N的Σ
对角阵中对角线上的零元素分块出来与U
、V'
K列/行之后的元素相乘使其总结果为零,这样就只剩下了M*K的X
和K*N的Y
。这样既然有些维度可以因为对应奇异值为零被完全去掉而不影响结果,那么我们也可以将一些对应奇异值小的维度去掉,只保留拥有高奇异值的维度,从而减少了大量维度但只损失很少的信息。
SVD的第二个用途是在自然语言处理中,我在《数学之美》这本书上读到。我们用A
矩阵来描述成千上万篇文章和几十上百万个词的关联性,A
里面每一列是一篇文章,每一行代表一个词,对应位置上是这个词的加权词频(比如TF-IDF值),然后我们对A
进行奇异值分解,分成这样:A=XBY
,这里和前面的:A=XY
的关联性在于,两式的X
相同,第二式的Y
等于第一式中的BY
,X
是M*K,B
是K*K,Y
是K*N。
第一个矩阵X
是对词分类的结果,它的每一行表示一个词,每一列表示一个同义词类,对应位置的值表示该词和该同义词类的相关性大小。
第三个矩阵Y
是对文章分类的结果,它的每一列对应一篇文章,每一行表示一个主题,对应位置的值表示该文章和该主题的相关性大小。
第二个矩阵则展示了不同同义词类和不同文章主题的相关性大小。
SVD的第三个用途是用在推荐系统中,同样是用在推荐系统中,我在CSDN博客上看到了与《机器学习实战》里面不一样的用法,《机器学习实战》里面,是根据我前面讲的SVD的第一个用途,对用户评分数据进行简化,然后在简化过的数据上运行相似度算法,所谓相似度算法也就是计算欧氏距离、余弦距离或者皮尔逊相关系数等。而我在博客中看到的用法如下:
前面我们证明了任意一个矩阵A
都能被我们满秩分解,那么现在我们有个评分矩阵R
:
我们将其分解:
上图中的U表示用户数,I表示商品数。然后就是利用R中的已知评分训练P
和Q
使得P
和Q
相乘的结果最好地拟合已知的评分,那么未知的评分也就可以用P
的某一行乘上Q
的某一列得到了:
我们还是采用之前的方法,先列损失函数(目标函数)再优化,这里采用平方误差函数:
优化这个的方法用梯度下降就可以了,前面详细讲过。这个式子在梯度下降的时候,很容易让人产生一个疑惑,x
在哪?自变量在哪?好像只有w
没有x
,的确,普通的式子中,都是将w
与x
进行某种计算得到估计值,进而得到每个样本的估计误差值,但是在这个式子中,x
实际上是一种对w
的选取逻辑,也就是行号和列号,根据x
选择相应w
进行计算,得到估计值,计算误差,梯度下降优化w
,提高拟合效果。这是这个目标函数与其他使用梯度下降方法进行优化的目标函数不同的地方。
第一个Topic机器学习基础到此结束,下一个Topic是深度学习基础。从1月15号到今天,正好一个月,在公司实习,996,只能抽业余时间来写,一个月两万五千多字,对自己来讲也算是在人工智能产品经理方向走出的第一步,希望自己能继续坚持下去,疏漏之处在所难免,希望得到各位前辈的批评指正。
也感谢能一句句看到这的你,如果你不是直接翻到结尾的话:)