天天看点

Python -- Sklearn:主成分分析PCA代码实现

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns

# 导入主成分分析包
from sklearn.decomposition import PCA

import warnings
warnings.filterwarnings("ignore")

# 初始化数据集
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
df['label'] = cancer.target

# 数据标准化
data = ( df - df.mean() ) / df.std()

# 主成分分析
pca = PCA()
pca.fit( data )
print('原数据的特征值or解释的方差:{}'.format(pca.explained_variance_))
print('主成分的方差贡献率:{}'.format(pca.explained_variance_ratio_))
print('主成分的累积方差贡献率:{}'.format(pca.explained_variance_ratio_.cumsum()))
print('原数据的特征向量:')
print(pca.components_.T)

# 解释方差的可视化
row, col = data.shape
plt.figure()
plt.scatter(range(1, col + 1), pca.explained_variance_)
plt.plot(range(1, col + 1), pca.explained_variance_)
plt.xlabel('所有的原始特征')
plt.ylabel('对应的特征值')
plt.grid()
plt.show()

# 选取前8个主成分
# 前8个主成分的特征向量的绝对值的热力图
data_cm = pd.DataFrame( np.abs(pca.components_.T[:, :8]), index = data.columns)
plt.figure( figsize=(12, 10) )
sns.heatmap( data_cm, annot = True, cmap = 'BuPu' )
plt.title("PCA", fontsize = 12)
plt.ylabel("Sepal Width")
plt.show()

# 显示转化后的数据
print('新数据:')
print( pd.DataFrame( pca.transform( data )[:, :8] ).head() )