Numpy 矩阵的特征值分解

本文详细介绍了如何使用numpy库计算矩阵的特征值和特征向量,包括特征向量的标准化过程,并提供了挑选前k大特征值及其对应特征向量的函数实现。
>>> a
array([[1, 2, 3],
       [5, 8, 7],
       [1, 1, 1]])
       
>>> e_vals,e_vecs = np.linalg.eig(a)

>>> e_vals
array([ 10.254515  ,  -0.76464793,   0.51013292])

>>> e_vecs
array([[-0.24970571, -0.89654947,  0.54032982],
       [-0.95946634,  0.19306928, -0.73818337],
       [-0.13065753,  0.39865186,  0.40389232]])
# 注意上面矩阵的列向量才是特征向量,l2范数为 1

>>> [np.linalg.norm(e_vecs[:,i],ord=2) for i in [0,1,2]]
[0.99999999999999989, 0.99999999999999989, 1.0]

挑选出前 k 大的特征值与特征向量:

def topk(mat,k):
    e_vals,e_vecs = np.linalg.eig(mat)
    sorted_indices = np.argsort(e_vals)
    return e_vals[sorted_indices[:-k-1:-1]],e_vecs[:,sorted_indices[:-k-1:-1]]

a = np.array([[1,2,3],[5,8,7],[1,1,1]])
vals,vecs = topk(a,2)
print(vals)
print(vecs)
[ 10.254515     0.51013292]
[[-0.24970571  0.54032982]
 [-0.95946634 -0.73818337]
 [-0.13065753  0.40389232]]
<think>我们被要求使用中文回答,并且按照给定的格式要求。用户的问题是关于如何在Python中实现矩阵特征值分解。根据引用内容,我们知道特征值分解(Eigendecomposition)是将矩阵分解为由其特征值特征向量表示的矩阵之积的方法,但需要注意只有对可对角化矩阵才可以施以特征分解。在Python中,我们可以使用NumPy库的`numpy.linalg.eig`函数来进行特征值分解。步骤:1.导入NumPy库。2.创建一个矩阵(注意:矩阵必须是方阵,因为特征值分解只对方阵定义)。3.使用`numpy.linalg.eig`函数计算特征值特征向量。4.输出结果。另外,引用中还提到了奇异值分解(SVD),但用户的问题明确是关于特征值分解的,所以我们专注于特征值分解。我们将按照要求,行内数学公式用$...$,独立公式用$$...$$,并单独成段。注意:特征值分解的数学表达式为:如果$A$是一个$n \times n$的矩阵,那么它可以分解为:$$A =Q \Lambda Q^{-1}$$其中,$Q$是特征向量组成的矩阵,$\Lambda$是由特征值组成的对角矩阵。但是,并不是所有方阵都可以进行特征值分解,只有当矩阵可对角化时才能进行。下面我们编写示例代码。</think>### Python实现矩阵特征值分解 特征值分解(Eigendecomposition)是将方阵分解特征值特征向量的过程,数学表达式为: $$A = Q \Lambda Q^{-1}$$ 其中: - $A$ 是 $n \times n$ 可对角化方阵 - $Q$ 是特征向量矩阵(列向量) - $\Lambda$ 是特征值对角矩阵 #### Python实现步骤(使用NumPy): ```python import numpy as np # 创建示例矩阵(必须是方阵) A = np.array([[4, 2, 3], [1, 5, 6], [7, 8, 9]]) # 特征值分解 eigenvalues, eigenvectors = np.linalg.eig(A) # 验证分解结果 Lambda = np.diag(eigenvalues) # 特征值对角矩阵 reconstructed_A = eigenvectors @ Lambda @ np.linalg.inv(eigenvectors) print("特征值:\n", eigenvalues) print("特征向量矩阵:\n", eigenvectors) print("重建矩阵:\n", reconstructed_A) # 应与原矩阵A近似 ``` #### 关键说明: 1. **输入要求**: - 矩阵必须是方阵(`n x n`) - 矩阵需可对角化(特征向量线性无关) 2. **输出解释**: - `eigenvalues`:一维数组,包含特征值 $\lambda_i$ - `eigenvectors`:矩阵的每一列是对应特征值特征向量 $\vec{v}_i$ 3. **数学验证**: 特征向量满足 $A\vec{v}_i = \lambda_i \vec{v}_i$,可通过以下代码验证: ```python for i in range(len(eigenvalues)): left_side = A @ eigenvectors[:, i] right_side = eigenvalues[i] * eigenvectors[:, i] print(f"特征值 {eigenvalues[i]:.2f} 验证: ", np.allclose(left_side, right_side)) ``` > **注意**:实际计算可能存在浮点误差,建议使用`np.allclose()`比较数值[^1][^2][^3]。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值