一、基本代码
sklearn.decomposition.PCA(n_components=None, *, copy=True,whiten=False, svd_solver='auto',tol=0.0, iterated_power='auto',random state=None)
参数介绍:
参数1:
n_components:这个参数可以设置为一个大于等于1的整数,表示数据降到的维数。默认值为n_components=min(样本数,特征数)。也可设置为一个(0,1]之间的数,用于设定主成分累积贡献率的阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数。
参数2:
whiten:Bool型数据:判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,方差都为1.默认值=False
参数3:
svd_solver:有4个可以选择的值:{'auto','full','arpack','randomized'},一般来说,使用默认值就够了。在sklearn较新版本,当指定n_components=‘mle',需要设置svd solver='full'方可.
重要属性:
components:返回具有最大方差的成分。
explained_variance_ratio:返回所保留的n个成分各自的方差百分比。
n_components:返回所保留的成分个数n。
mean:从训练集估算出的每个特征的经验平均值。
重要方法
> fit(X,y=None)
fit(X),表示用数据X来训练PCA模型。
函数返回值:调用fit方法的对象本身。比如pca.fit(X),表
示用X对pca这个对象进行训练。
> transform(X)
将数据X转换成降维后的数据。当模型训练好后,对于新输
入的数据,都可以用transform方法来降维。
> fit_transform(X)
用X来训练PCA模型,同时返回降维后的数据。
newX=pca.fit_transform(X),newX就是降维后的数据。
> inverse_transform()
将降维后的数据转换成原始维度的数据,
X=pca.inverse_transform(newX)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 设置随机种子以确保结果可复现
rng = np.random.RandomState(1)
# 使用随机数生成器创建二维数据集
# rng.rand(2, 2) 生成一个 2x2 的随机矩阵
# rng.randn(2, 200) 生成一个 2x200 的标准正态分布随机数矩阵
# np.dot 将两个矩阵相乘,结果是 200 个二维向量
X = np.dot(rng.rand(2, 2), rng.randn(2, 200)).T
# 绘制原始数据的散点图
plt.scatter(X[:, 0], X[:, 1])
plt.axis('equal') # 使 x 轴和 y 轴的比例相等
plt.show()
# 创建PCA模型对象,并指定降维后的维度为2
pca_model = PCA(n_components=2)
# 用数据X拟合PCA模型
pca_model.fit(X)
# 打印主成分(即特征向量)
print('Components:', pca_model.components_)
print('________')
# 打印解释方差比率(即每个主成分解释的方差比例)
print('Explained variance ratio:', pca_model.explained_variance_ratio_)
# 定义一个绘制向量的函数
def draw_vector(v0, v1, ax=None):
ax = ax or plt.gca() # 获取当前的坐标轴,如果没有则创建一个
arrowprops = dict(arrowstyle='->', linewidth=2, shrinkA=0, shrinkB=0) # 定义箭头属性
ax.annotate('', v0, v1, arrowprops=arrowprops) # 在图中绘制箭头
# 再次绘制原始数据的散点图,但设置透明度为0.2
plt.scatter(X[:, 0], X[:, 1], alpha=0.2)
# 绘制主成分向量
# 通过解释方差比率和主成分向量的乘积来确定向量的长度
for length, vector in zip(pca_model.explained_variance_ratio_, pca_model.components_):
v = vector * 3 * np.sqrt(length) # 缩放向量以更好地显示
draw_vector(pca_model.mean_, pca_model.mean_ + v) # 从数据的均值位置绘制向量
plt.axis('equal') # 使 x 轴和 y 轴的比例相等
plt.show() # 显示图形
二维降维为一维
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 生成随机数据
rng = np.random.RandomState(1)
X = np.dot(rng.rand(2, 2), rng.randn(2, 200)).T
# 创建PCA模型并进行拟合
pca_model = PCA(n_components=1) # 创建PCA模型,指定降维到一维
pca_model.fit(X) # 使用随机数据拟合PCA模型
X_pca = pca_model.transform(X) # 对数据进行PCA降维,得到一维数据
# 输出PCA组件和方差占比
print('成分:', pca_model.components_) # 输出PCA模型的主成分(特征向量)
print("---------------")
print('各成分方差占比:', pca_model.explained_variance_ratio_) # 输出各主成分对应的方差占比
print('原始数据的规模:', X.shape) # 输出原始数据的规模
print('降维后数据的规模:', X_pca.shape) # 输出降维后的数据的规模
# 将降维数据转换回原始维度数据
X_new = pca_model.inverse_transform(X_pca) # 将降维后的数据转换回原始维度的数据
# 可视化原始数据和降维恢复的数据
plt.scatter(X[:, 0], X[:, 1], alpha=0.2, label='Original Data') # 绘制原始数据的散点图
plt.scatter(X_new[:, 0], X_new[:, 1], alpha=0.6, label='PCA Reconstructed Data') # 绘制降维恢复的数据的散点图
plt.axis('equal') # 设置坐标轴刻度相等
plt.legend() # 显示图例
plt.show() # 展示可视化结果
高维降维
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
# 加载手写数字数据集
digits = load_digits()
# 输出原始数据集的规模
print('digits数据集的规模是:', digits.data.shape)
# 创建PCA模型并进行降维
pca_model = PCA(n_components=2) # 创建PCA模型,降维到二维
pca_data = pca_model.fit_transform(digits.data) # 对原始数据进行降维
print('降维后的数据集规模是:', pca_data.shape) # 输出降维后的数据集规模
print('降维后数据的累积解释方差占比为:', np.cumsum(pca_model.explained_variance_ratio_)) # 输出降维后的数据集的累积解释方差占比
# 使用PCA自动选择降维的维度
pca = PCA().fit(digits.data) # 使用PCA自动选择维度
plt.plot(np.cumsum(pca.explained_variance_ratio_)) # 绘制累积解释方差占比曲线
pca = PCA(n_components=0.9).fit(digits.data) # 设置阈值为0.9,选择能解释90%方差的维度
plt.plot(np.cumsum(pca.explained_variance_ratio_)) # 绘制累积解释方差占比曲线
plt.show() # 展示可视化结果
print('数据维度降低到:', pca.n_components_) # 输出数据降维后的维度
标签:分析,PCA,plt,成分,components,降维后,model,pca
From: https://blog.csdn.net/weixin_66403225/article/details/139706383