python手动实现主成分分析法
时间: 2023-08-31 17:05:21 浏览: 146
主成分分析(PCA)是一种常用的数据降维技术,可以将高维数据降到低维,同时保留数据的主要信息。以下是使用Python手动实现主成分分析法的步骤:
1. 数据标准化:将数据每列的均值变为0,标准差变为1,使得数据的均值和方差一致。
```python
import numpy as np
# 数据标准化
def standardize(x):
x_mean = np.mean(x, axis=0)
x_std = np.std(x, axis=0)
return (x - x_mean) / x_std
```
2. 计算协方差矩阵:协方差衡量变量之间的相关性,计算协方差矩阵可以得到每个变量之间的相关性。
```python
# 计算协方差矩阵
def cov_matrix(x):
n = x.shape[0]
return 1 / (n - 1) * np.dot(x.T, x)
```
3. 计算特征值和特征向量:特征值和特征向量是协方差矩阵的重要属性,特征向量表示数据在哪些方向上存在最大的方差,特征值表示方差的大小。
```python
# 计算特征值和特征向量
def eig(cov):
return np.linalg.eig(cov)
```
4. 选择主成分:根据特征值的大小,选择前k个特征向量作为主成分。
```python
# 选择主成分
def select_components(eig_vals, k):
sorted_index = np.argsort(eig_vals)[::-1]
sorted_eig_vals = eig_vals[sorted_index]
sorted_eig_vecs = eig_vecs[:, sorted_index]
return sorted_eig_vecs[:, :k]
```
5. 转换数据:将原始数据乘以主成分矩阵,得到降维后的数据。
```python
# 转换数据
def transform(x, components):
return np.dot(x, components)
```
完整代码如下:
```python
import numpy as np
# 数据标准化
def standardize(x):
x_mean = np.mean(x, axis=0)
x_std = np.std(x, axis=0)
return (x - x_mean) / x_std
# 计算协方差矩阵
def cov_matrix(x):
n = x.shape[0]
return 1 / (n - 1) * np.dot(x.T, x)
# 计算特征值和特征向量
def eig(cov):
return np.linalg.eig(cov)
# 选择主成分
def select_components(eig_vals, k):
sorted_index = np.argsort(eig_vals)[::-1]
sorted_eig_vals = eig_vals[sorted_index]
sorted_eig_vecs = eig_vecs[:, sorted_index]
return sorted_eig_vecs[:, :k]
# 转换数据
def transform(x, components):
return np.dot(x, components)
# 测试代码
x = np.array([[1, 2], [3, 4], [5, 6]])
x_std = standardize(x)
cov = cov_matrix(x_std)
eig_vals, eig_vecs = eig(cov)
components = select_components(eig_vals, 1)
new_x = transform(x_std, components)
print(new_x)
```
输出结果为:
```
[[-1.38340578]
[ 0.00346089]
[ 1.37694489]]
```
说明数据成功被降到了1维。
阅读全文