QR分解迭代求特征值——原生python实现(不使用numpy)
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)的更多相关文章
- 机器学习中的矩阵方法03:QR 分解
1. QR 分解的形式 QR 分解是把矩阵分解成一个正交矩阵与一个上三角矩阵的积.QR 分解经常用来解线性最小二乘法问题.QR 分解也是特定特征值算法即QR算法的基础.用图可以将分解形象地表示成: 其 ...
- QR分解与最小二乘
主要内容: 1.QR分解定义 2.QR分解求法 3.QR分解与最小二乘 4.Matlab实现 一.QR分解 R分解法是三种将矩阵分解的方式之一.这种方式,把矩阵分解成一个正交矩阵与一个上三角矩阵的 ...
- QR分解与最小二乘(转载自AndyJee)
转载网址:http://www.cnblogs.com/AndyJee/p/3846455.html 主要内容: 1.QR分解定义 2.QR分解求法 3.QR分解与最小二乘 4.Matlab实现 一. ...
- QR 分解
将学习到什么 介绍了平面旋转矩阵,Householder 矩阵和 QR 分解以入相关性质. 预备知识 平面旋转与 Householder 矩阵是特殊的酉矩阵,它们在建立某些基本的矩阵分解过程中起着 ...
- QR分解
从矩阵分解的角度来看,LU和Cholesky分解目标在于将矩阵转化为三角矩阵的乘积,所以在LAPACK种对应的名称是trf(Triangular Factorization).QR分解的目的在 ...
- MATLAB线性方程组的迭代求解法
MATLAB线性方程组的迭代求解法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一.实验目的 1. 借助矩阵按模最大特征值,判断解方程组的Jacobi ...
- 牛顿法求极值及其Python实现
最初对于牛顿法,我本人是一脸懵的.其基本原理来源于高中知识.在如下图所示的曲线,我们需要求的是f(x)的极值: 对于懵的原因,是忘记了高中所学的点斜式,直接贴一张高中数学讲义: 因为我们一路沿着x轴去 ...
- 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)
4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 290 Solved: 148[Submit][Status ...
- 矩阵QR分解
1 orthonormal 向量与 Orthogonal 矩阵 orthonormal 向量定义为 ,任意向量 相互垂直,且模长为1: 如果将 orthonormal 向量按列组织成矩阵,矩阵为 ...
随机推荐
- C#-WinForm跨线程修改UI界面
待解决的问题 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作.他们会引发软件的卡顿甚至假死,严重影响软件的使用. 因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程( ...
- Linux增加虚拟内存方法
例如增加2G虚拟内存,操作如下: [root@gamedb ~]# free -m[root@gamedb tmp]# dd if=/dev/zero of=/tmp/big_swap bs=1024 ...
- PJzhang:微软出口管制条例
猫宁!!! 翻译:PJzhang 微软公司的技术,产品和服务受美国出口管理法规(EAR)的约束,由美国商务部工业与安全局(BIS)监督执行. 此外,财政部,国务院对其他与出口相关的技术和产品转让,交易 ...
- 《0day安全-软件漏洞分析技术》实验笔记1
Crack 小实验 工具 Dev C++(书上使用的VS) IDA_Pro_v7.0 Ollydbg LordPE 010 editor 使用IDA打开文件 找到程序分支点 空格跳转到汇编界面 得到V ...
- 解决incorrect 'only available in ES6' warning (W119) with options `moz: true, esversion: 6` 报错问题
很多同学在新建vue项目时,会遇到 incorrect 'only available in ES6' warning (W119) with options `moz: true, esversio ...
- webdriervAPI(下载文件)
from selenium import webdriver driver = webdriver.Chorme() driver.get("http://www.baidu.co ...
- 【神经网络与深度学习】gflags介绍
gflags是什么: gflags是google的一个开源的处理命令行参数的库,使用c++开发,具备python接口,可以替代getopt. gflags使用起来比getopt方便,但是不支持参数的简 ...
- 好用的 Chrome 插件
这些好用的 Chrome 插件,提升你的工作效率 本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可 ...
- celery 调用scrapy
我的环境: celery 3.1.25 python 3.6.9 window10 celery tasks 代码如下,其中 QuotesSpider 是我的scrapy项目爬虫类名称 from ce ...
- 数据库索引 B+树
问题1.数据库为什么要设计索引?索引类似书本目录,用于提升数据库查找速度.问题2.哈希(hash)比树(tree)更快,索引结构为什么要设计成树型?加快查找速度的数据结构,常见的有两类:(1)哈希,例 ...