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 向量按列组织成矩阵,矩阵为 ...
随机推荐
- postman插件的安装以及简单介绍
1:postman是干什么的? Postman官网上这么介绍的:“Modern software is built on APIs,Postman helps you develop APIs fas ...
- 利用delve(dlv)在Visual Code中进行go程序的远程调试-debug方式
最近碰到一个问题,如何在Windows的IDE或者文本编辑器上,远程调试Linux服务器上的golang程序. 虽然想说gdb走你,但既然go有dlv这样的类似Java的jdwp的原生方案,而且我用的 ...
- XCTF (app2)
打开app,有两个输入框和一个按钮.点击按钮会跳转到新的页面显示Waiting for you. 打开JEB反编译. 如果两个输入框的长度都不为0,那么获取这两个值到v0和v1中,Log记录日志. 创 ...
- Python学习之初识
第一章 1.1 typora 的安装与使用 1.1.1 标题的创建: 方法一:用 ###+空格 表示标题,几个#就是几级标题 方法二:菜单栏-->段落-->选择标题 1.1.2 有序列表与 ...
- 配置中心 Spring Cloud config
配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储.Git以及Subversion. 1.服务端 创建spring boot 项目 主要依赖 <dependenc ...
- 卸载pkg安装包
1 基本原理 1.1 查看某个pkg安装包安装的所有文件 第一,查看所有安装的pkg $ pkgutil --pkgs 第二,查看指定pkg的所有安装文件 $ pkgutil --files the- ...
- 【案例分享】SpreadJS金融行业应用实践,开发基于Web Excel的指标补录平台
SpreadJS作为一款基于 HTML5 的纯前端电子表格控件,以“高速低耗.高度类似Excel.可无限扩展”为产品特色,提供移动跨平台和浏览器支持,可同时满足 .NET.Java.App 等应用程序 ...
- 什么是云数据库RDS PostgreSQL 版
PostgreSQL被业界誉为“最先进的开源数据库”,面向企业复杂SQL处理的OLTP在线事务处理场景,支持NoSQL数据类型(JSON/XML/hstore).支持GIS地理信息处理. 优点 NoS ...
- codeforces 620C
题目链接:https://codeforces.com/problemset/problem/620/C 题目分析 题意:给你一串珍珠,每个珍珠都有一个对应值,需要分割这n个珍珠(必须连续),使得每一 ...
- AC自动机练习题1:地图匹配
AC自动机板子,学习之前要是忘记了就看一下 1465: [AC自动机]地图匹配 poj1204 时间限制: 1 Sec 内存限制: 256 MB提交: 78 解决: 46[提交] [状态] [讨论 ...