矩阵该怎么计算

矩阵该怎么计算,第1张

内容选自程序员基础数学课程。

你好,我是黄慎。今天,我将谈论矩阵

矩阵由多个等长的向量组成,其中每一列或每一行都是一个向量。从数据结构的角度,我们可以把向量看成一维数组,把矩阵看成二维数组。

该矩阵具有二维数组的特性,可以表示二元关系,如图中节点的邻接关系或用户对项目的评分。通过对矩阵的各种运算,可以挖掘这些二元关系,在不同的应用场景下达到不同的目的。今天我将展示如何利用矩阵计算从图的邻接矩阵实现PageRank算法。

回顾PageRank链接分析算法在讲马尔可夫模型的时候,我已经介绍了PageRank链接分析算法。所以,在展示这个算法和矩阵运算的关系之前,我们先快速回顾一下它的核心思想。

PageRank是基于马尔可夫链的。它假设了一个“随机冲浪者”模型,冲浪者从某个网页出发,根据网页图中的链接随机访问。在每一步中,冲浪者将从当前页面的链接页面中随机选择一个页面作为下一个访问目标。此外,PageRank还引入了随机跳转操作,即浏览者不遵循网页图的拓扑结构,只是随机选择一个网页进行跳转。

基于之前的假设,PageRank的公式定义如下:

其中,pi代表第I个网页,Mi是pi的入站链接集合,pj是Mi集合中的第j个网页。PR(pj)代表网页pj的PageRank得分,L(pj)代表网页pj的外链数量,1/L(pj)代表网页pj跳转到pi的概率。α是用户不会随机跳转的概率,n代表所有网页的数量。

PageRank的计算是通过采样迭代法实现的:首先可以将所有网页节点的初始PageRank值设置为某个相同的数,比如1,然后我们就可以通过上面的公式得到每个节点新的PageRank值。每当一个页面的PageRank发生变化时,也会影响其出站链接所指向的页面,所以我们可以再次使用这个公式循环修正每个页面节点的值。因为这是一个马尔可夫过程,所以我们可以从理论上证明所有网页的PageRank最终都会达到一个稳定的值。整个证明过程非常复杂,这里我们只需要知道迭代计算过程。

简化的PageRank公式

那么,这个计算公式和矩阵运算有什么联系呢?为了简化问题,我们暂时不考虑随机跳转,只考虑用户根据网页之间的链接随机冲浪。那么PageRank的公式简化为:

此公式仅包含原始公式的σ (PR (PJ)/L (PJ))部分。我们来对比一下矩阵点乘的计算公式。

以上两个公式在形式上基本一致。因此,我们可以将σ (PR (PJ)/L (PJ))的计算分解为两个矩阵的点乘。一个矩阵是每个当前网页的PageRank得分,另一个矩阵是邻接矩阵。所谓邻接矩阵,其实就是表示图节点邻接关系的矩阵。

假设xi,J是矩阵第I行第J列的元素,那么我们就可以用xi,J来表示节点I到节点J的连接,放在PageRank的应用场景中。xi,j表示网页pi和网页pj之间的链接。原始邻接矩阵中包含的元素是0或1,0表示没有链接,1表示有链接。

考虑到PageRank中的乘积为1/L(pj),我们可以对邻接矩阵的每一行进行归一化处理,将原始值(0或1)除以L(pj),L(pj)表示有一个网页pj的外发链接,它正好是矩阵中pj行的和。所以我们可以基于行对原始邻接矩阵进行归一化,这样就可以得到一个每个元素为1/L(pj)的矩阵,其中J代表矩阵的第J行。请注意,这里的规范化意味着所有元素的总和为1。

为了您的方便,我将使用下面的拓扑图作为一个例子来给你详细的解释。

基于上图,原始矩阵为:

第I行和第J列中的元素值指示是否存在从节点I到J的链接..如果是,那么这个值是1;否则为0。

根据每行之和,归一化每行后的矩阵变成:

有了上面提到的邻接矩阵,我们就可以开始最简单的PageRank计算了。PageRank采用抽样迭代法计算。这里我把所有的初始值都设为1,在这里列出第一次计算的结果。

好了,我们已经成功迈出了第一步,但是还需要考虑随机跳转的可能性。

考虑到通过上述步骤的随机跳跃,我们找到了σ (PR (PJ)/L (PJ))部分。但是PageRank引入了随机跳转的机制。其实这部分也可以通过矩阵的点乘来实现。如果我们用A表示σ (PR (PJ)/L (PJ)),那么完整的PageRank公式可以表示为:

因此,我们可以将上述公式分解为以下两个矩阵的点乘:

我们还是用前面的例子,看看随机跳转后PageRank值变成多少。这里α取0.9。

如前所述,PageRank算法需要迭代计算。为了避免计算出来的值越来越大甚至溢出,我们可以将其归一化,保证所有节点的值之和为1。在这个处理之后,我们得到第一轮的PageRank值,它是下面的行向量:

[0.37027027 0.24864865 0.37027027 0.00540541 0.00540541]

接下来我们只需要重复前面的步骤,直到每个节点的值趋于稳定。

说到这里,我就完成了如何将PageRank的计算转化为多个矩阵的点乘的过程。这样我们就可以利用Python等科学计算语言提供的库来完成基于PageRank的链接分析。为了展示具体的代码,我以前面的拓扑图为例,详细告诉你每一步。

首先需要做一些初始化工作,包括设置节点个数,确定随机跳转概率α,表示拓扑图的邻接矩阵和存储所有节点PageRank值的数组。以下是示例代码,我在其中提供了注释供您参考。

复制代码

Import numpy as np #设置决定随机跳转概率的alpha,web节点数alpha = 0.9N = 5 #初始化矩阵jump = np.full ([2,1],[[alpha],[1-alpha],[Dtype = float)#构造邻接矩阵Adj = np.full ([n,n],[[0,0,1,0,0,0],[1,0,0,0,0],[0,0,0],[0,0,0]Full ([1,n],1,dtype = float),然后我们就可以用迭代法计算PageRank值了。一般我们可以通过比较每个节点的最后两个计算值是否足够接近来确定该值是否稳定以及是否需要结束迭代。这里,为了简单起见,我使用固定数量的循环来实现它。如果您的拓扑图很复杂,需要更多的迭代,我会在这里列出示例代码和注释。

复制代码

# PageRank算法本身是通过采样迭代进行的,在最终值趋于稳定时结束。对于范围(0,20)内的I:#点乘,计算σ (PR (PJ)/L (PJ)) PR = NP。Dot (PR,Adj) #转置存放σ (PR (PJ)/L (PJ))结果的矩阵,加入一个长度为N的列向量,其中每个元素的PR _ JUMP = NP。FULL ([n,2],[[0,1/n]]) PR _ JUMP [:,-1] = PR。TRANSPOSE () #做点乘,计算α (σ (PR (PJ)/L (PJ))+) Jump) #归一化PageRank得分PR = PR . TRANSPOSE()PR = PR/PR . sum()print(" round ",i+1,PR)如果成功运行以上两个代码,就可以看到最后每个节点的PageRank得分是多少。

Python中有一些优秀的库,比如networkx,提供了直接构建拓扑图和计算PageRank的功能。可以尝试使用这个库,构建一个样本拓扑图并计算每个节点的PageRank得分,最后与上面代码计算的PageRank得分进行比较,验证上面代码的结果是否合理。

综上,我们可以把向量看成一维数组,把矩阵看成二维数组。矩阵的点乘是由几个向量的点乘组成的,所以我们可以通过矩阵的点乘来挖掘向量对之间的关系。

今天讲了矩阵的点乘在PageRank算法中的应用。通过表示网页的邻接二元关系,我们可以用矩阵来计算PageRank得分。在这个应用场景中,矩阵点乘反映了多个马尔可夫过程中的状态转移。

矩阵乘法等运算也可以用在很多其他领域。比如我在上一节介绍K-means聚类算法的时候,提到需要计算某个数据点向量与其他数据点向量之间的距离或相似度,用多个数据点向量的平均值来获得质心点的向量,这可以通过矩阵运算来完成。

另外,在协同过滤推荐中,我们可以使用矩阵点乘来实现多个用户或项目之间的相似度,以及聚合相似度所导致的最终推荐结果。下一节我会用矩阵来表示用户和物品的二元关系,通过矩阵来计算协同过滤的结果。

欢迎分享,转载请注明来源:聚客百科

原文地址: https://juke.outofmemory.cn/life/625248.html

()
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-07-07
下一篇 2022-07-07

发表评论

登录后才能评论

评论列表(0条)

保存