主要的过程即是左变换变成上三角矩阵以及高斯回代,其中主要的繁杂步骤是变成上三角矩阵的步骤。
假设一个矩阵有n×n个元素,其中aij 表示第i行第j列的元素,进行转化为上三角矩阵的过程是
Ⅰ将第一行元素的元素乘以-aj1/a11(其中j表示从2-n行)然后加上2-n行的元素,这样的话就将第一列元素转变为只剩第一个元素不为0的一列了。
Ⅱ依据此步骤,在第i行即是将第i行元素乘以-aji/aii然后再加到后面的i+1到n行元素上,直到将矩阵转化为上三角矩阵。
该步骤的计算公式是:
其中求和需要一个for循环以及求n个未知数需要另一个for循环。由此可得,高斯消元法的复杂度是O(n3/3)
重要:
主要目的:尽可能的调整主元素的大小使其不会出现上面的因为分母过小而导致的误差变大的现象,所以列主元法其实就是在高斯消元法的基础上添加了一开始的选主元行的步骤,而选主元行主要是对该列的元素进行遍历直到找到绝对值最大的元素。所以增加的步骤如下:
雅可比迭代利用的是主要是并行算法,将一个矩阵分为三个部分,对角线元素,上三角矩阵以及下三角矩阵。A= D – L – U;
其中D可以直接利用diag(diag(A))获得。而L可以利用D - tril(A)获得,剩下的U就不用说了。雅可比迭代的计算公式如下:
主要的运算步骤如下:
其中norm是为了求x1-x0的无穷范数,即是x1-x0中最大的绝对值小于误差就终止迭代。
这一部分主要是为了在不需要设定exp的时候默认exp的值为0.0001,其中nargin是用于判断输入的参数的个数的。
利用Jacobi的示例如下:
其中p为迭代次数,而x为运行时间。
重点(雅可比迭代的收敛条件)
高斯赛德尔迭代与雅可比迭代的主要差别是雅可比每一次迭代过程中前后是没有关系的,而高斯赛德尔迭代则是每一次计算都是利用最新的结果。所以这一个过程就得到了加速。
高斯赛德尔迭代的计算公式如下:
复杂度是(2n2)
高斯赛德尔迭代的示例:
其中p为迭代次数,而x为运行时间。
重点(高斯赛德尔迭代的收敛条件)
逐次超松弛迭代法又称为SOR算法,其主要的加入了一个松弛引子w,考虑到的矩阵主要是密度比较小的矩阵的求解,可以看成是高斯赛德尔迭代的一种修正,而且当w = 1的时候,SOR就是高斯赛德尔迭代了。该算法的公式如下:
SOR算法每次迭代的主要运算量是计算一次矩阵与向量的乘法。
SOR迭代的示例如下:
从上面不难看出SOR算法的收敛性很快,而收敛性的快慢也取决于w的取值。
重点(SOR迭代的收敛条件)
共轭梯度法又称为CG方法。是一种求解大型稀疏对称正定方程组的一种十分有效的方法。
主要步骤如下:
其中SOR的w默认为1.3,同时为了满足雅可比的苛刻收敛条件以及SOR算法收敛的条件的综合,使用的测试矩阵是A为对称正定矩阵以及2D-A也为正定矩阵的矩阵。如下为生成矩阵的方法:对称正定矩阵是用二次型构造的,而终止条件则是2D-A的特征值均大于0.而相对误差则设置为
(注:~isempty(find(a<0)) 如果有负数则为真,如果没有则为假)
利用的是统计图进行运算时间的统计,同时使用的是cputime来获取运行时间的。
统计图如下:因为每一次运行的时间可能具有偶然性,所以就测试100次运算的时间平均值,得到以下的统计图
根据统计图我们可以大概看到:
显示着运行了几次,只截了下面两张图,不难看到对于两个不同的矩阵,最好的w值是不一样的,此时的阶数是50。一开始当松弛因子逐渐增大的时候,会导致迭代次数降低,而当松弛因子达到最佳松弛因子的时候,则迭代次数会降到最低,而超过了这一个数值之后,迭代次数会反弹增加。
在Epinions 社交数据集中,每个网络节点可以选择信任其它节点。借鉴Pagerank 的思想编写程序,对网络节点的受信任程度进行评分。
PageRank主要引入的指标是链接指标,即是很多其他网页如果存在对这个网页的指向,那么这个被指向的网页的排名必然会就比较高,当然其他网页的排名也会影响这个网页的排名。如果一个网页存在指向另一个网页的链接,则记为1,不管有几个指向链接。在一定的网页数量构成的网络中,这就构成了一个矩阵,所以PageRank的思想是由这一个矩阵计算每一个网页的排名。而因为每一个网页之间会互相影响,所以就需要进行迭代计算知道算出最稳定的数值。每一个网页的PG计算如下:
后面那一个值的原因是:所有这些被换算为一个百分比再乘上一个系数。由于“没有向外链接的页面”传递出去的PageRank会是0,所以,Google通过数学系统给了每个页面一个最小值。
因为下下来之后发现那个数据贼恐怖,有几万个节点,所以就选择0、4、5、7、8、9、10、11、12、13 这10个,根据这10个所组成的小的信任圈所计算出来的结果显示出来
根据这几个的关系我们可以得到矩阵如下(第一行代表的是0为起始点的,第二行代表的是4为起始点的,以此类推):
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1;
1, 0, 0, 0, 0, 0, 1, 0, 1, 0;
1, 1, 0, 0, 1, 0, 0, 0, 1, 0;
0, 0, 0, 0, 1, 0, 0, 0, 0, 0;
1, 0, 1, 0, 0, 0, 0, 0, 0, 0;
1, 0, 0, 0, 0, 0, 1, 0, 0, 0;
0, 0, 0, 1, 0, 1, 0, 1, 1, 0;
1, 1, 1, 0, 0, 0, 1, 0, 1, 0;
1, 0, 1, 1, 0, 0, 1, 1, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
而利用写好的PageRank算法进行受信度评分,
根据上面的评分图我们可以看到0的可信度最高,而13的可信度最低,因为在这个信任圈中13并没有任何指向的元素。而评分的话可以根据上面的权重大小进行划分。
%L = input('The matrix \n');
%输入矩阵L
%迭代终止参数变量
sigma = 0.0001;
%获取图的总结点数
N= size(L,1);
% 用来检查L矩阵上是否存在大于1的链接,如果有置为1;
for k= 1:N
for j = 1:N
if( L(k, j) ~= 0)
L(k, j) = 1;
end
end
end
q= 0.85; % 默认阻尼系数
% 构造D
d= sum(L,2);
D= diag(d);
% 构造M= L'*D^(-1)
M= L'*inv(D);
e= ones(N,1);
a= (d==0); % a为用于描述“悬挂网页”的行向量
% 构造S
S= M + e*a'/N;
% 构造最终的概率转移矩阵
G= q*S + (1-q)*e*e'/N;
H0= zeros(N,1); % 初始化H0
H1= ones(N,1); % 默认初始权重向量均为1
count= 0; % 初始化迭代次数
% 终止条件是小于允许的误差
while norm(H1-H0) >= sigma
H0= H1;
H1= G*H0;
count= count+1;
end
% 输出结果
while 1
D = diag(rand(size_(i),1));
U = orth(rand(size_(i),size_(i)));
A = U' * D * U;
if ~isempty(find(eig(2*diag(diag(A))-A)<=0)) == 0
break;
end
end