【进阶】Numpy特征值与特征向量计算
发布时间: 2024-06-27 20:53:30 阅读量: 94 订阅数: 113
求特征值和特征向量1
![python高等数学处理合集](https://img-blog.csdnimg.cn/a153eb8be5bc4ada85d312708ef5f5a4.png)
# 2.1 Numpy的linalg模块
Numpy提供了linalg模块,其中包含了计算特征值和特征向量的函数。
### 2.1.1 eig()函数
`eig()`函数用于计算方阵的特征值和特征向量。其语法如下:
```python
eig(a)
```
其中:
- `a`:输入的方阵
`eig()`函数返回一个元组,其中包含两个数组:
- `w`:特征值数组
- `v`:特征向量数组,每一列对应一个特征值
### 2.1.2 eigh()函数
`eigh()`函数用于计算对称矩阵的特征值和特征向量。其语法如下:
```python
eigh(a)
```
其中:
- `a`:输入的对称矩阵
`eigh()`函数返回一个元组,其中包含两个数组:
- `w`:特征值数组
- `v`:特征向量数组,每一列对应一个特征值
# 2. Numpy计算特征值与特征向量
### 2.1 Numpy的linalg模块
Numpy提供了`linalg`模块用于处理线性代数运算,其中包含了计算特征值和特征向量的函数。
#### 2.1.1 eig()函数
`eig()`函数用于计算实对称矩阵或复埃尔米特矩阵的特征值和特征向量。其语法为:
```python
eig(a)
```
其中:
* `a`:输入的实对称矩阵或复埃尔米特矩阵。
`eig()`函数返回一个元组,包含两个元素:
* 特征值:一个包含特征值的数组。
* 特征向量:一个包含特征向量组成的矩阵,每列对应一个特征值。
#### 2.1.2 eigh()函数
`eigh()`函数用于计算实对称矩阵或复埃尔米特矩阵的特征值和特征向量,并返回特征值和特征向量按大小降序排列。其语法为:
```python
eigh(a)
```
其中:
* `a`:输入的实对称矩阵或复埃尔米特矩阵。
`eigh()`函数返回一个元组,包含两个元素:
* 特征值:一个包含特征值按大小降序排列的数组。
* 特征向量:一个包含特征向量组成的矩阵,每列对应一个特征值,按大小降序排列。
### 2.2 特征值与特征向量的性质
#### 2.2.1 特征值的几何意义
特征值代表了矩阵沿其特征向量方向的伸缩因子。正特征值表示矩阵沿该方向伸缩,而负特征值表示矩阵沿该方向收缩。
#### 2.2.2 特征向量的正交性
对于实对称矩阵或复埃尔米特矩阵,其特征向量是正交的。这意味着它们在几何空间中相互垂直。
### 代码示例
```python
import numpy as np
# 创建一个实对称矩阵
A = np.array([[2, 1], [1, 2]])
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
# 打印特征值和特征向量
print("特征值:", eigenvalues)
print("特征向量:")
print(eigenvectors)
```
输出:
```
特征值: [3. 1.]
特征向量:
[[ 0.70710678 0.70710678]
[ 0.70710678 -0.70710678]]
```
在这个例子中,矩阵A的特征值为3和1,特征向量分别为[0.70710678, 0.70710678]和[0.70710678, -0.70710678]。
# 3.1 降维与主成分分析
#### 3.1.1 PCA原理
主成分分析(PCA)是一种无监督降维技术,其目的是将高维数据投影到低维空间,同时最大化保留原始数据的方差。PCA的原理如下:
1. **中心化:**将数据集中每个特征减去其均值,使数据围绕原点分布。
2. **协方差矩阵:**计算中心化后的数据协方差矩阵。协方差矩阵的对角线元素表示每个特征的方差,而非对角线元素表示特征之间的协方差。
3. **特征值分解:**对协方差矩阵进行特征值分解,得到特征值和特征向量。特征值表示协方差矩阵沿每个特征向量的方差,而特征向量表示这些方向。
4. **降维:**选择最大的`k`个特征值对应的特征向量,作为降维后的新特征。这些特征向量称为主成分,它们捕捉了原始数据中最大的方差。
#### 3.1.2 Numpy实现PCA
```python
import numpy as np
from sklearn.decomposition import PCA
# 数据中心化
data_centered = data - np.mean(data, axis=0)
# 计算协方差矩阵
cov_matrix = np.cov(data_centered)
# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
# 降维
pca = PCA(n_components=2)
pca.fit(data_centered)
data_reduced = pca.transform(data_centered)
```
**代码逻辑分析:**
* `data_centered`将数据中心化,使数据围绕原点分布。
* `cov_matrix`计算中心化后的数据协方差矩阵。
* `eigenvalues`和`eigenvectors`通过特征值分解获得特征值和特征向量。
* `pca`使用Scikit-Learn的PCA类进行降维,`n_components`指定降维后的维度。
* `data_reduced`将原始数据投影到低维空间。
#### 3.2 聚类与相似性度量
#### 3.2.1 K-Means算法
K-Means算法是一种基于距离的聚类算法,其目标是将数据点划分为`k`个簇,使得每个簇内的点与簇中心的距离最小。K-Means算法的步骤如下:
1. **初始化:**随机选择`k`个点作为初始簇中心。
2. **分配:**将每个数据点分配到距离最近的簇中心。
3. **更新:**重新计算每个簇的中心,作为簇内所有点的均值。
4. **重复:**重复步骤2和步骤3,直到簇中心不再发生变化。
#### 3.2.2 谱聚类算法
谱聚类算法是一种基于图论的聚类算法,其利用数据点的相似性构建一个相似性图,然后对图进行谱分解。谱聚类算法的步骤如下:
1. **构建相似性图:**计算数据点之间的相似性,并用一个相似性矩阵表示。
2. **谱分解:**对相似性矩阵进行谱分解,得到特征值和特征向量。
3. **聚类:**将特征向量投影到低维空间,然后使用K-Means算法或其他聚类算法进行聚类。
# 4. Numpy特征值与特征向量计算实战
### 4.1 人脸识别案例
**4.1.1 数据预处理
0
0