PCA和LDA进行数据降维

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
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值