import sklearn.decomposition as dp
pca=dp.PCA(n_components=0.90)
reduced_x=pca.fit_transform(data) #压缩后的数据
reduced_x= np.dot(data,pca.components_)
pca.components_#各主成分的权向量
pca.n_components# 在此临界值下筛选出主成分个数
print(pca.n_component)
二、实验作业
案例一、半导体数据降维
1.
案例介绍
半导体是在一些极为先进的工厂中制造出来的。工厂或制造设备不仅需要花费上亿美元,而且还需要大量的工人。制造设备仅能在几年内保持其先进性,随后就必须更换了。单个集成电路的加工时间会超过一个月。在设备生命期有限,花费又极其巨大的情况下,制造过程中的每一秒钟都价值巨大。如果制造过程中存在瑕疵,我们就必须尽早发现,从而确保宝贵的时间不会花费在缺陷产品的生产上。一些工程上的通用解决方案是通过早期测试和频繁测试来发现有缺陷的产品,但仍然有一些存在瑕疵的产品通过了测试。如果机器学习技术能够用于进一步减少错误,那么它就会为制造商节省大量的资金。接下来我们将考察面向上述任务中的数据集,而它也比前面使用的数据集更大,并且包含了许多特征。具体地讲,它拥有 590
个特征。我们看看能否对这些特征进行降维处理。(数据集
secom.data
)
2.
数据预处理
本数据集存在缺失数据,将每列的缺失值补全为该列的所有非缺失值的均值。
3.
利用
sklearn
模块相关方法进行主成分分析
(1)画出崖底碎石图,观察此图看是否个主成分的贡献率的差异情况;
(2)选择不同的阈值
0.7
,
0.8
,
0.9
,筛选出不同个数的主成分;
(3)计算在不同阈值条件下属性的压缩比,即主成分个数
/
所有原始数据的属性 个数
案例二、图像特征抽取
案例介绍:作为降维技术的鼻祖,主成分分析技术在图象识别领域大显身手。
1.
数据采集与处理
自拍一张照片,然后调用 PCA-fig.py
文件中的相关函数,并制定主成分的个数 1,2,3…100
,观察一下在不同主成分个数的条件下,图片的变化。
2.
程序修改
设定主成分累积贡献率的阈值实现主成分个数的自适应确定。
import pandas as pd
import numpy as np
import sklearn.decomposition as dp
import matplotlib.pyplot as plt
data=pd.read_csv(r'./secom.data',delimiter=' ')
num=data.shape[1]
# 2.数据预处理
# 本数据集存在缺失数据,将每列的缺失值补全为该列的所有非缺失值的均值
for column in list(data.columns[data.isnull().sum() > 0]):
mean_val = data[column].mean()
data[column].fillna(mean_val, inplace=True)
# 3.利用 sklearn 模块相关方法进行主成分分析
# (1)画出崖底碎石图,观察此图看是否个主成分的贡献率的差异情况;
data1=data.T
ov_mat = (data1.T - np.mean(data1 , axis = 1)).T# x-mean(x) 以备计算协方差矩阵使用
eig_val, eig_vec = np.linalg.eigh(np.cov(data1)) #计算协方差矩阵的特征值和特征向量
p = np.size(eig_vec, axis =1)
idx = np.argsort(eig_val) #按照特征值从小到大顺序排序
idx = idx[::-1]#按照特征值从大到小顺序排序
eig_vec = eig_vec[:,idx] #特征向量,即计算主成分的权向量(所有的)
eig_val = eig_val[idx] #特征值,即所有主成分的方差
ll=eig_val/np.sum(eig_val)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(ll)
plt.xlabel("主成分的个数")
plt.ylabel("主成分贡献率")
plt.show()
# (2)选择不同的阈值 0.7,0.8,0.9,筛选出不同个数的主成分;
# (3)计算在不同阈值条件下属性的压缩比,即主成分个数/所有原始数据的属性
# 个数
n_com=[0.7,0.8,0.9]
for n_component in n_com:
pca=dp.PCA(n_components=n_component)
reduced_x=pca.fit_transform(data)
reduced_x= np.dot(data,pca.components_.T)
x=reduced_x.shape[1]
ratio=round(x/num,5)
print(f"在阈值{n_component}下,主成分个数{x}个,压缩比为{ratio}")
'''
# pca=dp.PCA(n_components=0.9)
# reduced_x=pca.fit_transform(data) #压缩后的数据
# reduced_x=np.dot(data,pca.components_.T)
# l1=pca.explained_variance_ratio_
# print(l1)
# l2=np.cumsum(pca.explained_variance_ratio_)
# l2=l2[::-1]
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
n_components: int, float, None or string。降维后的主成成分数量
若 0 < n_components < 1,则方差和需要大于 n_components 所指定的
阈值,PCA 会自动地选择下降维数;
如果 n_components 取整数,则事先指定主成分个数。
copy:True 或 False,默认为 True,即是否需要将原始训练数据复制。
whiten:True 或 False,默认为 False,即是否白化,使得每个特征具有相同
的方差
代码:
import sklearn.decomposition as dp
pca=dp.PCA(n_components=0.90)
reduced_x=pca.fit_transform(data) #压缩后的数据
reduced_x= np.dot(data,pca.components_)
pca.components_#各主成分的权向量
pca.n_components# 在此临界值下筛选出主成分个数
print(pca.n_component)
'''
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)