📜  使用Python进行主成分分析PCA

📅  最后修改于: 2020-04-23 02:16:49             🧑  作者: Mango

主成分分析PCA是一种统计过程,用于将一组可能相关变量的观测值转换为一组线性不相关变量的值。
以这样一种方式选择每个主成分,使得它将描述大多数仍然可用的方差,并且所有这些主成分彼此正交。在所有主成分中,第一个主成分具有最大方差。

PCA的用途:

  • 它用于查找数据中变量之间的相互关系。
  • 它用于解释和可视化数据。
  • 随着变量数量的减少,这使得进一步分析变得更加简单。
  • 它通常用于可视化群体之间的距离和相关性。

这些基本上在正方形对称矩阵上执行。它可以是平方和叉积矩阵或协方差矩阵或相关矩阵的纯和。如果个体方差相差很大,则使用相关矩阵。

PCA的目标:

  • 从本质上讲,这是一个非依赖性过程,其中将属性空间从大量减少到较少数量。
  • PCA基本上是降维过程,但不能保证尺寸是可解释的。
  • 此PCA的主要任务是从较大的集合中选择变量的子集,基于此变量,原始变量与本金的相关性最高。

主轴法: PCA基本上搜索变量的线性组合,以便我们可以从变量中提取最大方差。此过程完成后,将其删除并搜索另一个线性组合,该组合给出了有关剩余方差的最大比例的解释,该比例主要导致正交因子。在这种方法中,我们分析了总方差。

特征向量:它是一个非零向量,在矩阵相乘后保持平行。假设x是矩阵M的维度r的特征向量,如果Mx和x平行,则特征向量维度r * r。然后,我们需要求解Mx = Ax,其中x和A均未知,以获取特征向量和特征值。
在特征向量下,我们可以说主成分同时显示变量的公共方差和唯一方差。基本上,这是一种以方差为中心的方法,旨在再现所有方差的总方差和相关性。主成分基本上是原始变量的线性组合,这些原始变量按其贡献加权,以解释特定正交维度中的方差。

特征值:它基本上被称为特征根。它基本上测量了由该因素引起的所有变量的方差。特征值的比率是因素相对于变量的解释重要性的比率。如果因子较低,则对变量解释的贡献较小。用简单的话来说,它衡量的是因素给定的数据库总数的方差量。我们可以将因子的特征值计算为所有变量的因子加载平方值之和。
现在,让我们了解使用Python进行主成分分析。
要获取实施中使用的数据集,请点击此处
步骤1:导入库

# 导入所需的库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

步骤2:导入数据集
导入数据集并将数据集分布到X和y组件中以进行数据分析。

# 导入或加载数据集
dataset = pd.read_csv('wines.csv')
# 将数据集分布到两个部分X和Y
X = dataset.iloc[:, 0:13].values
y = dataset.iloc[:, 13].values

步骤3:将资料集分为训练集和测试集

# 将X和Y分为训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

步骤4:缩放
在训练和测试集上进行预处理,例如安装标准秤。

# 执行预处理部分
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

步骤5:应用PCA
将PCA应用于训练和测试集以进行分析。

# 将PCA功能应用于X组件的训练和测试集
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)
explained_variance = pca.explained_variance_ratio_

步骤6:将 Logistic回归拟合到训练集中

# 将Logistic回归拟合到训练集
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0)
classifier.fit(X_train, y_train)

步骤7:预测测试结果

# 在LogisticRegression下使用预测函数预测测试集结果
y_pred = classifier.predict(X_test)

步骤8:制作混淆矩阵

# 在检验集和预测值之间建立混淆矩阵.
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

步骤9:预测训练集结果

# 通过散点图预测训练集结果
from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1,
                     stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1,
                     stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),
             X2.ravel()]).T).reshape(X1.shape), alpha = 0.75,
             cmap = ListedColormap(('yellow', 'white', 'aquamarine')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green', 'blue'))(i), label = j)
plt.title('Logistic Regression (Training set)')
plt.xlabel('PC1') # for Xlabel
plt.ylabel('PC2') # for Ylabel
plt.legend() # to show legend
# 显示散点图
plt.show()

步骤10:可视化测试集结果

# 通过散点图可视化测试集结果
from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1,
                     stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1,
                     stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),
             X2.ravel()]).T).reshape(X1.shape), alpha = 0.75,
             cmap = ListedColormap(('yellow', 'white', 'aquamarine')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green', 'blue'))(i), label = j)
# 散点图的标题
plt.title('Logistic Regression (Test set)')
plt.xlabel('PC1') # for Xlabel
plt.ylabel('PC2') # for Ylabel
plt.legend()
# 显示散点图
plt.show()