在机器学习中,指标不全面会无法保证模型的准确性,但指标太多又容易造成指标维度灾难。主成分分析的主要思想
1) 进行特征降维变换,不能完全地表示原有的对象,能量总会有损失。
2) 希望找到一种能量最为集中的变换方法使得损失最小
主成分分析就是试图在力保数据信息丢失最小的原则下,对这种多变量的数据进行最佳综合简化,也就是,对高维变量空间进行降维。
python 代码如下:
## Original_data: 输入待降维的数据(全部为数值型变量),返回该数据应该保留下来的成分维度数n
def cal_n(Original_data):
mean_vals = Original_data.mean()
# 计算每列的均值
mid = Original_data - mean_vals
### step01 计算协方差矩阵
cov_mat = mid.cov()
### step02: 计算协方差矩阵的特征值和特征向量
eig_vals, eig_vectors = np.linalg.eig(cov_mat)
eig_vals = sorted(eig_vals, reverse = True)
## 把主成份含量总和 > 95%的成分留下来
sum_prop = sum(eig_vals)
n = 1
x_prop = 0
for i in range(len(eig_vals)):
x_prop += eig_vals[i]
prop = x_prop / sum_prop
if prop <= 0.95:
n += 1
else:
break
return n
该方法可以找到一个n,使得降维后变换后留下原来95%的信息量。接下来进行PCA变换,代码如下:
# 对数据进行PCA变换处理
## data: 要进行处理的数据 ; n_compotents: 要留下的成分个数
## 定义pca变换
def chensqPca(data , n_compotents):
mean_vals = data.mean()
mid = data - mean_vals
### step01 计算协方差矩阵
cov_mat = mid.cov()
### step02: 计算协方差矩阵的特征值和特征向量
eig_vals, eig_vectors = np.linalg.eig(cov_mat)
#print(type(eig_vals))
### step03把特征值按照从小到大的顺序排列,并选取排在前面的n_components个特征值所对应的特征向量
eig_val_index = np.argsort(eig_vals)
#print(eig_val_index)
#n_compotents = 1
eig_val_index = eig_val_index[:-(n_compotents + 1): -1]
#print(eig_val_index)
eig_vectors = eig_vectors[:, eig_val_index]
# step04 将样本投影到选取的特征向量上
low_dim_mat = np.dot(mid, eig_vectors)
return low_dim_mat