首页 > 其他分享 >[神经网络与深度学习笔记]PCA降维

[神经网络与深度学习笔记]PCA降维

时间:2024-09-21 14:51:15浏览次数:1  
标签:特征值 plt eigen 降维 神经网络 train PCA 数据

PCA降维

PCA是一种无监督降维算法,它是最常用的降维算法之一,可以很好的解决因变量太多而复杂性,计算量增大的弊端。

本质上讲,PCA就是将高维的数据通过线性变换投影的方式映射到低维空间上去,并且保证在投影的维度上,原数据的信息量最大(损失最小)。

PCA的具体步骤

  • 1.特征中心化。每一维的数据都减去该维的均值。这里的“维”指的就是一个特征(或属性),变换之后每一维的均值都变成了0。每一列减去该列均值后,得到矩阵B
image-20240918164135886

去中心化不会影响样本的分布性质,可以简化PCA算法的推倒过程

  • 计算B的协方差矩阵C
  • 求出协方差矩阵C的特征值和对应的特征向量
  • 从大到小排序特征值,取得最前的k个特征向量P
  • 将数据转换到k个特征向量构建的新空间中
import matplotlib
import numpy as np
from sklearn.decomposition import PCA
from sklearn.datasets import fetch_olivetti_faces
import matplotlib.pyplot as plt
import cv2

matplotlib.use('TkAgg')  # 指定交互式框架为TkAgg
# 加载人脸数据集
faces = fetch_olivetti_faces()
pic_seed = 10
X = faces.data

# 随机选择一张人脸图片
face = X[pic_seed].reshape(64, 64)

# 将人脸数据进行PCA降维
# 将数据降维到50个主成分
# n_components = [50]
n_components = [50,40,30,20,10]
# 显示结果
fig, axs = plt.subplots(1, len(n_components)+1, figsize=(10, 10))
axs[0].imshow(face, cmap='gray')
axs[0].set_title('Original Face')
index = 1

for items in n_components:
    pca = PCA(n_components=items)
    X_pca = pca.fit_transform(X)

    # 将降维后的数据进行逆转换
    X_restored = pca.inverse_transform(X_pca)

    face_restored = X_restored[pic_seed].reshape(64, 64)

    axs[index].imshow(face_restored, cmap='gray')
    axs[index].set_title(str(items))
    index += 1

plt.show()

image-20240918173119652

左一为原始的64*64图像,通过pca降维成50、40、30、20、10个维度之后

通过逆转换还原图像得到结果

还有一个是葡萄酒数据集

# 读取数据()
df_wine = pd.read_csv('wine.data',header=None)
# 设置列索引
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']

数据维度为178*14

image-20240918174140301

该数据集是UCI的公开数据集,是对意大利同一地区种植的葡萄酒进行分析的结果,数据集共14列数据,第一个属性是类标识符,分别是1/2/3来表示,代表葡萄酒的三个分类。剩余的13个属性是,酒精、苹果酸、灰、灰分的碱度、镁、总酚、黄酮类化合物、非黄烷类酚类、原花色素、颜色强度、色调等。

数据集划分

# 数据集设置: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)

数据标准化

# 实例化
sc = StandardScaler()

# 对数据集进行标准化(一般情况下我们在训练集中进行均值和方差的计算,直接在测试集中使用)
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.transform(X_test)

PCA实现

# 计算协方差矩阵
cov_mat = np.cov(X_train_std.T)

# 对协方差矩阵进行特征值分解
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)

得到特征值

image-20240918174410397

特征值分布

# 特征值之和
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')

image-20240918174534748

特征降维

# 创建列表,由(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)

image-20240918174637776

# 取前两个特征值对应的特征向量作为主要成分
w = np.hstack((eigen_pairs[0][1][:, np.newaxis],
               eigen_pairs[1][1][:, np.newaxis]))

image-20240918174708542

进行特征压缩

image-20240918174750183

结果展示

# 特征压缩后结果展示
colors = ['r', 'b', 'g']
markers = ['s', 'x', 'o']

for l, c, m in zip(np.unique(y_train), colors, markers):
    # 按照样本的真实值进行展示
    plt.scatter(X_train_pca[y_train == l, 0], 
                X_train_pca[y_train == l, 1], 
                c=c, label=l, marker=m)

plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc='lower left')
plt.tight_layout()
plt.show()

image-20240918174813316

这个结果有助于之后进行分类

标签:特征值,plt,eigen,降维,神经网络,train,PCA,数据
From: https://www.cnblogs.com/jinwan/p/18424009

相关文章

  • [神经网络与深度学习笔记]LDA降维
    LDA降维LinearDiscriminantAnalysis线性判别分析,是一种有监督的线性降维算法。与PCA保持数据信息不同,LDA的目标是将原始数据投影到低维空间,尽量使同一类的数据聚集,不同类的数据尽可能分散步骤:计算类内散度矩阵\(S_b\)计算类间散度矩阵\(S_w\)计算矩阵\(S_w^{-1}S_b\)对矩......
  • php8:开启opcache和JIT(php 8.3.9)
    一,配置文件中的项:opcache.enable=1opcache.enable_cli=0opcache.memory_consumption=128opcache.max_accelerated_files=10000opcache.revalidate_freq=240opcache.save_comments=0opcache.error_log=/data/logs/phplogs/opache_error.logopcache.enable=1    #......
  • 【语义分割】语义分割中的语义指的是什么?卷积神经网络中的特征指的是什么?什么是高级特
    【语义分割】语义分割中的语义指的是什么?卷积神经网络中的特征指的是什么?什么是高级特征?什么是低级特征?【语义分割】语义分割中的语义指的是什么?卷积神经网络中的特征指的是什么?什么是高级特征?什么是低级特征?文章目录【语义分割】语义分割中的语义指的是什么?卷积神经......
  • 【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状
    【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状态或模型决策的结果??【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状态或模型决策的结果??文章目录【深度学习|可视化】如何以图形化的方式展示神经......
  • 回归预测|2024年最新优化算法美洲狮优化器PO 基于美洲狮PO优化BP神经网络数据时间序列
    回归预测|2024年最新优化算法美洲狮优化器PO基于美洲狮PO优化BP神经网络数据时间序列算法完整Maltab程序有对比文章目录一、基本原理1.美洲狮优化算法(POA)简介2.BP神经网络(BPNeuralNetwork)简介3.PO-BP回归预测流程总结二、实验结果三、核心代码四、代码获取五......
  • Java中的图神经网络:如何在大规模图数据中实现嵌入学习
    Java中的图神经网络:如何在大规模图数据中实现嵌入学习大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!近年来,图神经网络(GraphNeuralNetworks,GNN)在处理图结构数据上取得了显著进展,尤其是在社交网络、推荐系统、知识图谱等领域。与传统的神经网络......
  • 多输入多输出 | Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测
    多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测目录多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料预测效果基本介绍多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入......
  • 时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测
    时序预测|Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测目录时序预测|Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测预测效果基本介绍程序设计参考资料预测效果基本介绍Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测(完整源码和数据)1.data为数据集,单......
  • CNN-SVM模型 | Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络结合支持向量机多特征分
    CNN-SVM模型|Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络结合支持向量机多特征分类预测目录CNN-SVM模型|Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料分类效果基本描述1.Matlab实现SO-CNN-SVM蛇群算法优化......
  • 图神经网络模型的应用(8)--1
    1.图数据上的一般任务        前面介绍过,按照元素和层级来划分,图数据上的任务一般可以分为节点上的任务、边上的任务和图上的任务。而在实际应用中,大部分图神经网络的应用都集中在节点分类、链路预测和图分类上;在设计一个新的图神经网络模型时,我们常使用的标准数据集......