DimensionalityReduction
PCA和LDA进行数据降维
使用PCA对数据进行降维,我们使用两种方式:
直接按数学推导的方式实现PCA
使用sklearn实现PCA
利用降维后的特征进行逻辑回归分类
代码使用LDA对数据进行降维,我们使用两种方式:
直接按数学推导过程实现LDA
使用sklearn实现LDA
利用降维后的特征进行逻辑回归分类
#%% md
#%%
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from matplotlib.colors import ListedColormap
from sklearn.linear_model import LogisticRegression
#%% md
# 数据获取
#%%
# 读取数据()
df_wine = pd.read_csv('wine.data',header=None)
#%% md
该数据集是UCI的公开数据集,是对意大利同一地区种植的葡萄酒进行分析的结果,数据集共14列数据,第一个属性是类标识符,分别是1/2/3来表示,代表葡萄酒的三个分类。剩余的13个属性是,酒精、苹果酸、灰、灰分的碱度、镁、总酚、黄酮类化合物、非黄烷类酚类、原花色素、颜色强度、色调等。
#%%
# 设置列索引
df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash',
'Alcalinity of ash', 'Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins',
'Color intensity', 'Hue',
'OD280/OD315 of diluted wines', 'Proline']
#%%
# 数据维度
df_wine.shape
#%%
# 每一类数据包含的样本个数
df_wine['Class label'].value_counts()
#%%
df_wine.head()
#%% md
# 数据集划分
#%%
# 数据集设置:X为样本特征数据,y为目标数据,即标注结果
X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values
#%%
# 数据集划分: 将数据集划分为训练集和测试集数据(测试集数据为30%,训练集为70%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
stratify=y,
random_state=0)
#%% md
# 数据标准化
#%%
# 实例化
sc = StandardScaler()
#%%
# 对数据集进行标准化(一般情况下我们在训练集中进行均值和方差的计算,直接在测试集中使用)
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.transform(X_test)
#%% md
# PCA(Pricipal component analysis)
#%% md
## PCA实现
#%% md
### 特征值计算
#%%
# 计算协方差矩阵
cov_mat = np.cov(X_train_std.T)
#%%
# 对协方差矩阵进行特征值分解
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)
#%%
# 特征值
eigen_vals
#%% md
### 特征值分布
#%%
# 特征值之和
tot = sum(eigen_vals)
#%%
# 对特征进行排序,并计算所占的比例
var_exp = [(i / tot) for i in sorted(eigen_vals, reverse=True)]
#%%
# 累计求和
cum_var_exp = np.cumsum(var_exp)
#%%
# 绘制图像
plt.figure()
plt.bar(range(1, 14), var_exp, alpha=0.5, align='center',
label='特征值分布')
plt.step(range(1, 14), cum_var_exp, where='mid',
label='累计特征值')
plt.ylabel('特征值比例')
plt.xlabel('特征index')
plt.legend(loc='best')
#%% md
### 特征降维
#%%
# 创建列表,由(eigenvalue, eigenvector)元组构成
eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:, i])
for i in range(len(eigen_vals))]
#%%
# 按特征值从大到小对列表(eigenvalue, eigenvector)排序
eigen_pairs.sort(key=lambda k: k[0], reverse=True)
#%%
# 特征值与特征向量
eigen_pairs
#%%
# 取前两个特征值对应的特征向量作为主要成分
w = np.hstack((eigen_pairs