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 向量按列组织成矩阵,矩阵为 ...
随机推荐
- 使用shell脚本常见的一些问题
Jdk版本:jdk-8u102-linux-x64 Tomcat版本:apache-tomcat-7.0.92 Redis版本:redis-5.0.0 由于公司项目的需要,要在多台服务器上面部署一些应 ...
- ASP.NET(C#) 使用 SqlBulkCopy 实现批量插入SQL(快捷简单)
业务需要,系统在处理数据时,每暂存一列数据将他插入到右侧的表格中,再执行批量保存,如图所示: //以前的做法可能是生成一堆 insert into xx values xxx 的sql语句,在程序中去 ...
- group_by和having的用法
#encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Enum ...
- 简单nginx代理配置
nginx.conf: # For more information on configuration, see:# * Official English Documentation: http:// ...
- 使用CompletableFuture进行异步任务编排
1.JDK5引入了Future进行异步任务的处理,Future 的接口主要方法有以下几个: (1)boolean cancel (boolean mayInterruptIfRunning) 取消任务 ...
- (5.11)mysql高可用系列——复制中常见的SQL与IO线程故障
关键词:mysql复制故障处理 [1]手工处理的gtid_next(SQL线程报错) 例如:主键冲突,表.数据库不存在,row模式下的数据不存在等. [1.1]模拟故障:GTID模式下的重复创建用户 ...
- “automation服务器不能创建对象”的问题的解决方案大全
本人工作中的应用系统都是jsp的,大量javascript程序,一旦出“automation服务器不能创建对象”问题,大量报表及查询无法保存,苦思冥想.千尝万试,终于将其搞定,现将相关方案与大家共享. ...
- 阿里云服务器挖矿脚本bioset攻击解决
1.问题出现 一大早刚起床,阿里云就给我发了一条短信,提醒我服务器出现紧急安全事件:挖矿程序 阿里云“贴心”地提供了解决方法,不过需要购买企业版的安全服务,本着能自己动手就不花钱原则自己搞了起来 于是 ...
- python使用Flask作为MockServer的方法
日常开发/测试过程中,需要对相关服务添加挡板--Mock 简单介绍一下使用python的Flask插件,对相关的服务进行Mock # coding:utf-8 import os from flask ...
- leecode刷题(28)-- 二叉树的前序遍历
leecode刷题(28)-- 二叉树的前序遍历 二叉树的前序遍历 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 思路 ...