QR分解:

有很多方法可以进行QR迭代,本文使用的是Schmidt正交化方法

具体证明请参考链接 https://wenku.baidu.com/view/c2e34678168884868762d6f9.html

迭代格式

实际在进行QR分解之前一般将矩阵化为上hessnberg矩阵(奈何这个过程比较难以理解,本人智商不够,就不做这一步了哈哈哈)

迭代终止条件

看了很多文章都是设置一个迭代次数,感觉有些不是很合理,本来想采用A(k+1)-A(k)的对角线元素的二范数来作为误差的,但是我有没有一些严格的证明,所以本文也采用比较大众化的思路,设置迭代次数。

Python实现

 M = [[2, 4, 2], [-1, 0, -4], [2, 2, 1]]

 import copy
import math class QR(object): def __init__(self, data):
self.M = data
self.degree = len(data) def get_row(self, index):
res = []
for i in range(self.degree):
res.append(self.M[i][index])
return res def get_col(self, index):
res = []
for i in range(self.degree):
res.append(self.M[i][index])
return res @staticmethod
def dot(m1, m2):
res = 0
for i in range(len(m1)):
res += m1[i] * m2[i]
return res @staticmethod
def list_multi(k, lt):
res = []
for i in range(len(lt)):
res.append(k * lt[i])
return res @staticmethod
def one_item(x, yArr):
res = [0 for i in range(len(x))]
temp_y_arr = [] n = len(yArr)
if n == 0:
res = x
else:
for item in yArr:
k = QR.dot(x, item) / QR.dot(item, item)
temp_y_arr.append(QR.list_multi(-k, item))
temp_y_arr.append(x) for item in temp_y_arr:
for i in range(len(item)):
res[i] += item[i]
return res @staticmethod
def normal(matrix):
yArr = []
yArr.append(matrix[0]) for i in range(1, len(matrix)):
yArr.append(QR.one_item(matrix[i], yArr))
return yArr @staticmethod
def normalized(lt):
res = []
sm = 0
for item in lt:
sm += math.pow(item, 2)
sm = math.sqrt(sm)
for item in lt:
res.append(item / sm)
return res @staticmethod
def matrix_T(matrix):
mat = copy.deepcopy(matrix)
m = len(mat[0])
n = len(mat)
for i in range(m):
for j in range(n):
if i < j:
temp = mat[i][j]
mat[i][j] = mat[j][i]
mat[j][i] = temp
return mat @staticmethod
def matrix_multi(mat1, mat2):
res = []
rows = len(mat1[0])
cols = len(mat1)
for i in range(rows):
temp = [0 for i in range(cols)]
res.append(temp) for i in range(rows):
for j in range(cols):
sm = 0
for k in range(cols):
sm += (mat1[k][i] * mat2[j][k])
res[j][i] = sm
return res def execute(self):
xArr = []
for i in range(self.degree):
xArr.append(self.get_col(i))
yArr = QR.normal(xArr)
self.Q = []
for item in yArr:
self.Q.append(QR.normalized(item)) self.R = QR.matrix_multi(QR.matrix_T(self.Q), xArr)
return (self.Q, self.R) # A = [
# [1, 0, -1, 2, 1],
# [3, 2, -3, 5, -3],
# [2, 2, 1, 4, -2],
# [0, 4, 3, 3, 1],
# [1, 0, 8, -11, 4]
# ]
# A = [
# [1, 2, 2],
# [2, 1, 2],
# [2, 2, 1]
# ]
A = [
[3, 2, 4],
[2, 0, 2],
[4, 2, 3]
] temp = copy.deepcopy(A)
val = [] # 特征值
times = 20 # 迭代次数
for i in range(times):
qr = QR(temp)
(q, r) = qr.execute()
temp = QR.matrix_multi(r, q)
temp = QR.matrix_T(temp) for i in range(len(temp)):
for j in range(len(temp[0])):
if i == j:
val.append(temp[i][j])
# 特征值
print(val)

结果展示

总结

使用QR分解迭代求特征值,收敛的比较快,也可以求出所有的特征值,但是如果要求特征向量的话,还是需要求解线性方程组(感觉很麻烦)

QR分解迭代求特征值——原生python实现(不使用numpy)的更多相关文章

  1. 机器学习中的矩阵方法03:QR 分解

    1. QR 分解的形式 QR 分解是把矩阵分解成一个正交矩阵与一个上三角矩阵的积.QR 分解经常用来解线性最小二乘法问题.QR 分解也是特定特征值算法即QR算法的基础.用图可以将分解形象地表示成: 其 ...

  2. QR分解与最小二乘

    主要内容: 1.QR分解定义 2.QR分解求法 3.QR分解与最小二乘 4.Matlab实现   一.QR分解 R分解法是三种将矩阵分解的方式之一.这种方式,把矩阵分解成一个正交矩阵与一个上三角矩阵的 ...

  3. QR分解与最小二乘(转载自AndyJee)

    转载网址:http://www.cnblogs.com/AndyJee/p/3846455.html 主要内容: 1.QR分解定义 2.QR分解求法 3.QR分解与最小二乘 4.Matlab实现 一. ...

  4. QR 分解

    将学习到什么 介绍了平面旋转矩阵,Householder 矩阵和 QR 分解以入相关性质.   预备知识 平面旋转与 Householder 矩阵是特殊的酉矩阵,它们在建立某些基本的矩阵分解过程中起着 ...

  5. QR分解

        从矩阵分解的角度来看,LU和Cholesky分解目标在于将矩阵转化为三角矩阵的乘积,所以在LAPACK种对应的名称是trf(Triangular Factorization).QR分解的目的在 ...

  6. MATLAB线性方程组的迭代求解法

    MATLAB线性方程组的迭代求解法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一.实验目的 1. 借助矩阵按模最大特征值,判断解方程组的Jacobi ...

  7. 牛顿法求极值及其Python实现

    最初对于牛顿法,我本人是一脸懵的.其基本原理来源于高中知识.在如下图所示的曲线,我们需要求的是f(x)的极值: 对于懵的原因,是忘记了高中所学的点斜式,直接贴一张高中数学讲义: 因为我们一路沿着x轴去 ...

  8. 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)

    4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 290  Solved: 148[Submit][Status ...

  9. 矩阵QR分解

    1 orthonormal 向量与 Orthogonal 矩阵 orthonormal 向量定义为 ,任意向量  相互垂直,且模长为1: 如果将  orthonormal 向量按列组织成矩阵,矩阵为  ...

随机推荐

  1. Xshell 6 安装注册说明

    1.下载 官方下载到的版本在进行安装的时候,是有序列号输入框的如下图,但是好像我们从那个所谓的官网上下载的却没有,只能下载到一点击注册就跳转到一个网站的那种版本. 像上面这种版本如何下载呢? 我们去官 ...

  2. C#与Unity 数据存储

    使用Json存储数据 1.创建Json文件,直接创建txt文件,将后缀名改为xx.json 2.Json文件的数据格式,中括号表示列表,即中括号下的每个逗号隔开的内容都是列表的每个元素,花括号表示对象 ...

  3. Unity3D入门 UnityAPI常用方法和类

    时间函数: 这里只列举了一部分,更多的看Scripting API using System.Collections; using System.Collections.Generic; using ...

  4. PJzhang:crunch,一个很好的字典生成工具

    猫宁!!! 之前收集子域名的时候使用过子域名挖掘机这个windows软件,查看了它所使用的字典,基本上是小写字母数字1-4位的一个合集.   36+36*36+36*36*36+36*36*36*36 ...

  5. ciscn-华北赛区-Day1-Web2题解

    漏洞点 薅羊毛逻辑漏洞 Cookie伪造 -> JWT python反序列化 -> 反弹shell 薅羊毛逻辑漏洞 打开题目是这样一个页面 其实最初的题目这个募集资金的进度条是没有刷满的, ...

  6. nginx配置ssi实现页面拆分

    在做一个网站时,页面上会有很多重复的内容,每个页面写一遍很冗余,修改时还容易遗漏,所以可以把公共的部分写好,放在单独的HTML中,用时引用就行了. nginx配置ssi可以将单个页面拆分成一个一个的小 ...

  7. git clone 含有子模块的项目

    当一个 git 项目包含子模块(submodule) 时,直接克隆下来的子模块目录里面是空的. 有两种方法解决: 方法一 如果项目已经克隆到了本地,执行下面的步骤: 初始化本地子模块配置文件 git ...

  8. PageObject 页面对象模式

    一.PageObject 页面对象设计模式  (一个页面建一个类,即对象,页面对象) 每个页面都建对应的class,类中包含了页面的输入框.标题.元素等元素,测试代码中测试这个页面时,只需要调用这个页 ...

  9. MySQL性能优化(四):SQL优化

    原文:MySQL性能优化(四):SQL优化 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ ...

  10. webpack 四个核心概念

    webpack 是当下最热门的前端资源模块化和打包工具.它可以将许多松散的模块(如 CommonJs 模块. AMD 模块. ES6 模块.CSS.图片. JSON.Coffeescript. LES ...