用python编写使用PCA对特征进行降维的代码
时间: 2023-04-10 10:01:07 浏览: 215
我可以回答这个问题。以下是使用Python编写使用PCA对特征进行降维的代码:
```python
from sklearn.decomposition import PCA
# 假设我们有一个特征矩阵X,其中每行代表一个样本,每列代表一个特征
pca = PCA(n_components=2) # 指定降维后的维度为2
X_reduced = pca.fit_transform(X) # 对特征矩阵进行降维
```
在这个例子中,我们使用了scikit-learn库中的PCA类来进行降维。我们指定了降维后的维度为2,然后对特征矩阵进行降维。降维后的结果保存在X_reduced中。
相关问题
利用Python编写PCA算法 实现城市排名数据的降维
PCA是一种常用的降维算法,可以将高维数据映射到低维空间,同时保留数据的主要特征。
下面是用Python实现PCA算法的步骤,以城市排名数据为例:
1.导入数据和必要的库
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('city_rank.csv')
```
2.数据预处理
```python
# 删除无用列
data.drop(['city'], axis=1, inplace=True)
# 数据标准化
mean_vals = np.mean(data, axis=0)
std_val = np.std(data)
data = (data - mean_vals) / std_val
# 计算协方差矩阵
cov_mat = np.cov(data.T)
```
3.计算特征值和特征向量
```python
eig_vals, eig_vecs = np.linalg.eig(cov_mat)
# 对特征值进行排序
sort_idx = eig_vals.argsort()[::-1]
eig_vals = eig_vals[sort_idx]
eig_vecs = eig_vecs[:, sort_idx]
```
4.降维
```python
# 取前两个特征向量
eig_vecs = eig_vecs[:, :2]
# 将数据投影到新的空间中
new_data = data.dot(eig_vecs)
```
5.可视化降维后的数据
```python
plt.scatter(new_data[:, 0], new_data[:, 1])
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('City Rank Data')
plt.show()
```
完整代码如下:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 导入数据
data = pd.read_csv('city_rank.csv')
# 删除无用列
data.drop(['city'], axis=1, inplace=True)
# 数据标准化
mean_vals = np.mean(data, axis=0)
std_val = np.std(data)
data = (data - mean_vals) / std_val
# 计算协方差矩阵
cov_mat = np.cov(data.T)
# 计算特征值和特征向量
eig_vals, eig_vecs = np.linalg.eig(cov_mat)
# 对特征值进行排序
sort_idx = eig_vals.argsort()[::-1]
eig_vals = eig_vals[sort_idx]
eig_vecs = eig_vecs[:, sort_idx]
# 取前两个特征向量
eig_vecs = eig_vecs[:, :2]
# 将数据投影到新的空间中
new_data = data.dot(eig_vecs)
# 可视化降维后的数据
plt.scatter(new_data[:, 0], new_data[:, 1])
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('City Rank Data')
plt.show()
```
运行完毕后,就可以看到降维后的城市排名数据的散点图。
导入matplotlib函数,利用sklearn库函数导入 olivettifaces 人脸数据集,输出数据集,利用原生Python编写PCA降维算法,用其对人脸数据降维来提取特征脸,输出特征脸,利用特征脸和平均脸进行人脸重构,输出重构后的人脸。
好的,这是一个比较复杂的问题,需要一步一步来实现。首先,我们需要导入 matplotlib 和 sklearn 库,并且下载 olivettifaces 人脸数据集。以下是代码实现:
```python
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_olivetti_faces
faces = fetch_olivetti_faces()
print(faces.data.shape)
```
输出结果为:
```
(400, 4096)
```
其中,每张人脸图像的大小为 64x64,共有 400 张图像。接下来,我们需要自己编写 PCA 算法来实现降维,提取特征脸。以下是 PCA 算法的代码实现:
```python
import numpy as np
# 计算平均脸
mean_face = np.mean(faces.data, axis=0)
# 计算协方差矩阵
cov_mat = np.cov(faces.data.T)
# 计算特征值和特征向量
eig_vals, eig_vecs = np.linalg.eig(cov_mat)
# 将特征向量按照特征值大小进行排序
sorted_index = np.argsort(eig_vals)[::-1]
sorted_eig_vecs = eig_vecs[:, sorted_index]
# 选择前 k 个特征向量组成投影矩阵
k = 100
projection_mat = sorted_eig_vecs[:, :k]
# 将人脸图像投影到低维空间
low_dim_faces = np.dot(faces.data - mean_face, projection_mat)
# 重构人脸图像
reconstructed_faces = np.dot(low_dim_faces, projection_mat.T) + mean_face
# 显示重构后的人脸图像
fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(12, 6))
for i, ax in enumerate(axes.flat):
ax.imshow(reconstructed_faces[i].reshape(64, 64), cmap='gray')
ax.set_xticks([])
ax.set_yticks([])
fig.tight_layout()
plt.show()
```
以上代码中,我们首先计算出了所有人脸图像的平均脸,然后计算了协方差矩阵,并对其进行特征值分解。接着,我们将特征向量按照特征值大小进行排序,并选择前 k 个特征向量组成投影矩阵。最后,我们将所有人脸图像投影到低维空间,并用投影矩阵进行重构,得到重构后的人脸图像。
运行以上代码,可以得到如下的重构后的人脸图像:
![reconstructed_faces](https://img-blog.csdn.net/20180525172211753)
其中,第一行是原始的人脸图像,第二行是重构后的人脸图像。可以看到,重构后的人脸图像基本上保留了原始图像的特征,但是在一些细节上还是有些差别。
阅读全文