PCA原理与水果成熟状态数据分析实例:Python中PCA-LDA 与卷积神经网络CNN

news/2024/9/19 17:10:34/文章来源:https://www.cnblogs.com/tecdat/p/18374571

全文链接:https://tecdat.cn/?p=37450 

主成分分析(PCA)作为数据科学中用于可视化和降维的重要工具,在处理具有大量特征的数据集时非常有用。就像我们难以找到时间阅读一本 1000 页的书,而更倾向于 2 到 3 页的总结以抓住整体概貌一样,当数据集中特征过多时,PCA 可以帮助我们减少维度,提高模型训练效率,同时尽可能保留更多信息。例如在图像处理和基因组研究等常见应用中,往往需要处理成千上万甚至数万个列的数据,此时维度灾难可能成为问题,而 PCA 则能发挥重要作用。

降维中的主成分分析法(PCA)


在众多的数据集中,部分变量的研究价值相对有限。为了实现连贯性分析,降维便成为一种必要手段。而在降维过程中,关键在于尽可能地保留原始数据中的有用信息。接下来,以二维数据降为一维为例,对主成分分析法进行介绍。

由于我们所研究的主要问题在于参数之间的相关关系,而这种相关关系主要体现在各个数据点的相对位置方面。需注意的是,数据点的具体位置并不会对其相关关系产生影响。

接下来,我们需要找出对数据影响最大的方向。为此,不妨设定一个单位向量来表示这个方向。然后,将表示各个数据点的向量向该方向进行投影,并求出方差的表达式。

在对数据影响最大的方向上,数据点的分散程度最高,也就是方差最大。在此处,我们运用拉格朗日乘数法来求取最值。从化简后的结果可以看出,我们所寻求的方向正是数据协方差矩阵的特征向量方向。对协方差矩阵进行特征值分解,特征值中较大的那个所对应的特征向量具有重要意义。

 

一、实现过程

 

  1. 数据标准化:首先对数据进行处理,使其每个特征的均值为零,方差为一。
    • 这样可以确保数据在后续分析中的稳定性和可比性。
  2. 协方差矩阵计算:计算标准化后数据的协方差矩阵,该矩阵能够描述特征之间的相关性。
    • 协方差矩阵反映了不同特征之间的关联程度。
  3. 特征值分解:对协方差矩阵进行特征值分解,从而得到特征值和对应的特征向量。
    • 特征值和特征向量在主成分分析中起着关键作用。
  4. 主成分选择:依据特征值的大小,选取前 k 个特征值对应的特征向量,以此构建新的坐标系。
    • 选择重要的特征向量可以更好地表示数据的主要信息。
  5. 数据投影:将原始数据投影到新的坐标系中,进而得到降维后的数据集。
    • 通过投影实现数据的降维处理。

 

二、应用场景

 

  1. 图像处理:PCA 可用于图像压缩,在减小图像维度的同时保留主要信息。
    • 有助于节省存储空间和提高图像处理效率。
  2. 金融分析:在金融领域,PCA 可用于降维和风险管理,能够帮助识别资产之间的相关性。
    • 为金融决策提供有力支持。

 

三、优点

 

  1. 降维:PCA 能够减小数据的维度,降低存储和计算成本。
    • 提高数据处理的效率。
  2. 去冗余:有助于去除冗余信息,提取出最重要的特征。
    • 使数据更加简洁有效。
  3. 可视化:可将数据可视化,以便更好地理解数据结构和关系。
    • 增强对数据的直观认识。

 

四、缺点

 

  1. 信息损失:降维可能会导致信息损失,特别是当较少的主成分用于表示数据时。
    • 需要在降维和信息保留之间进行权衡。
  2. 线性假设:PCA 基于线性假设,可能不适用于非线性数据。
    • 对于非线性数据的处理效果有限。
  3. 选择主成分数量:需要选择保留的主成分数量,这可能是一个主观过程。
    • 增加了分析的不确定性。

 

 

Python主成分分析PCA、线性判别分析LDA、卷积神经网络分类分析水果成熟状态数据|附代码数据

本文对给定数据集进行多类别分类任务时所采用的各种统计和机器学习技术进行了总结。给定数据集包含 20 个类别,对应 10 种不同的水果及其成熟或未成熟状态。为实现分类任务,首先进行数据可视化,接着进行数据预处理,包括异常值检测技术(如局部异常因子和隔离森林)以及数据缩放技术(如标准缩放器和分位数转换器)。

随后运用降维算法如主成分分析(PCA)和线性判别分析(LDA)以及聚类技术,将聚类 ID 作为额外特征添加到数据集中。最后尝试通过深度学习技术(如卷积神经网络)来提高模型准确性。通过交叉验证评估模型性能,并比较其准确性和计算效率。总体而言,本项目展示了统计机器学习技术在多类别分类任务中的有效性,并强调了异常值检测和降维在提高机器学习模型准确性方面的重要性。

 

 

数据加载与重构

 

  1. 导入数据:

 

 
  1.  
    df = pd.read_csv('../../codes/sml/project/train.csv')
  2.  
    df.head()
 
 
  1.  
     
  2.  
    df = pd.read_csv('../../codes/sml/project/train.csv')
  3.  
    df.head()
  4.  
     
  5.  
    将字符串标签转换为代码:
  6.  
    categories_list = df[ 'category' ].astype( 'category' ).cat.categories
  7.  
    df[ 'category' ] = df[ 'category' ].astype('category').cat.codes
 
  1. 拆分数据为特征矩阵和目标向量:
 
  1.  
     
  2.  
    X = data[:,:-1]
  3.  
    y = data[:,-1]
  4.  
    print(X.shape)
  5.  
    print(y)
 

去除异常值

 

使用隔离森林去除异常值:

 
  1.  
     
  2.  
    from sklearn.ensemble import IsolationForest
  3.  
    clf = IsolationForest(max_samples = 100, random_state = 1
 

 

多层感知机神经网络

 

  1. 数据标准化:
 
  1.  
     
  2.  
    from sklearn.preprocessing import StandardScaler
  3.  
    scaler = StandardScaler()
 
  1. 进行主成分分析:

 

 
  1.  
     
  2.  
    from sklearn.decomposition import PCA
  3.  
    pca = PCA(n_components=363)
  4.  
    pca.fit(nn_X_train)
 
  1. 进行线性判别分析:

 

 
  1.  
     
  2.  
    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
  3.  
    lda = LinearDiscriminantAnalysis(n_components=19)
  4.  
    lda.fit(nn_X_train, nn_y_train)
  5.  
     
  6.  
    nn_X_train_lda = lda.transform(nn_X_train)
  7.  
    nn_X_test_lda = lda.transform(nn_X_test)
 
  1. 构建并训练多层感知机模型:

 

 
  1.  
     
  2.  
    val_acc = []
  3.  
    pca_acc = []
  4.  
    lda_acc = []
  5.  
    pca_lda_acc = []
  6.  
     
  7.  
    for i in range(40, 44):
  8.  
    # clf = MLPClassifier(solver='adam' , alpha=1e-5, random_state=i, max_iter=10000, hidden_layer_sizes=(300, 60))
  9.  
    # clf = MLPClassifier(solver='lbfgs' , alpha=1e-5, random_state=i, max_iter=10000, hidden_layer_sizes=(300, 59))
  10.  
    # best one till now
  11.  
    clf = MLPClassifier(solver='adam' , alpha=1e-5, random_state=i, max_iter=10000, hidden_layer_sizes=(448, 119, 170, 116))
  12.  
     
  13.  
    # clf = MLPClassifier(solver='adam' , alpha=1e-5, random_state=i, max_iter=10000, hidden_layer_sizes=(300, 60))
  14.  
    clf.fit(nn_X_train, nn_y_train)
 

  1. 输出不同处理方式下的平均准确率:

 

 
  1.  
    print(sum(val_acc)/len(val_acc))
  2.  
    print(sum(pca_acc)/len(pca_acc))
  3.  
    print(sum(lda_acc)/len(lda_acc))
  4.  
    print(sum(pca_lda_acc)/len(pca_lda_acc))
 
 

卷积神经网络

 

  1. 特征值归一化:
print(X_train.max())

 

主成分分析PCA

 
  1.  
    from sklearn.decomposition import PCA
  2.  
    pca = PCA(n_components=900)
  3.  
    X_train = pca.fit_transform(X_train)
  4.  
    X_test = pca.transform(X_test)
  5.  
    X_train = X_train.reshape(X_train.shape[0], 30, 30, 1)
  6.  
    X_test = X_test.reshape(X_test.shape[0], 30, 30, 1)
 

LDA

  1. 进行线性判别分析:
 
  1.  
    # lda = LDA(n_components=18)
  2.  
    # X_train = lda.fit_transform(X_train, y_train)
  3.  
    # X_test = lda.transform(X_test)
 

可视化样本

 
  1.  
    plt.figure(figsize=(10,10))
  2.  
    for i in range(25):
  3.  
    plt.subplot(5,5,i+1)
 

 

定义卷积神经网络架构

 
  1.  
    from tensorflow.keras import regularizers
  2.  
     
  3.  
    model = models.Sequential()
  4.  
     
  5.  
    model.add(layers.Conv2D(128, (3, 3), activation
 

 

 

编译卷积神经网络

model.compile(optimizer='adam',

绘制准确率与 epoch 的关系图

 
  1.  
     
  2.  
     
  3.  
    test_loss, test_acc = model.evaluate(X_test.reshape(X_test.shape[0], 64, 64, 1), y_test, verbose=2)
 
10/10 - 0s - loss: 0.9434 - accuracy: 0.7888 - 211ms/epoch - 21ms/step

评估模型并输出结果

 
  1.  
    df_test = pd.read_csv('../../codes/sml/project/test.csv')
  2.  
    df_test.head()
 

 

结论

 

通过对多种机器学习和深度学习技术的应用与比较,本文展示了不同方法在多类别分类任务中的性能表现。逻辑回归在公共数据上取得了较高的准确率,而卷积神经网络在私有数据上表现出色。同时,数据预处理中的异常值检测和降维技术对提高模型准确性起到了重要作用。未来,可以进一步探索更先进的模型架构和优化方法,以提高多类别分类任务的性能。

 

关于分析师

在此对Shixian Ding对本文所作的贡献表示诚挚感谢,他在中国科学技术大学完成了计算机科学与技术(主修)和金融学(辅修)的学位,专注机器学习、数理金融、数据采集、数据挖掘领域。擅长 R 语言、Python、MySQL、Matlab。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/785549.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[题解] permutation

[题解] Permutation解析一眼 DP 或者 组合。70pts 场上推的DP 对于 \((4,2,2)\),先把所有序列枚举出来: \[\begin{split} 1\ \ \ 2\\ 1\ \ \ 3\\ 1\ \ \ 4\\ --\\ 2\ \ \ 3\\ 2\ \ \ 4\\ 3\ \ \ 4 \end{split} \]可以发现,对于分割线上的部分,可以看作 \((3,1,1)\) 的所有序…

金蝶云星空一个业务对象下存在两个扩展时处理方案

问题描述: 出现这种情况一般是在A账套删除了一个扩展,然后又新建了一个扩展,此时登录B账套就会出现这种情况。如果是同一台机器,那未引入对象即是被删除的,未加载对象则是刚扩展的。解决方案: 此时未加载不建议加载,先引入需要删除的对象,然后删除,最后再加载。

信息学奥赛初赛天天练-72-NOIP2016普及组-基础题3-无向图、简单无向图、自环、平行边、顶点的度、握手定理、递归

NOIP 2016 普及组 基础题3 5 以下不是存储设备的是( ) A 光盘 B 磁盘 C 固态硬盘 D 鼠标 6 如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照 CapsLock、 字母键 A、字母键 S、字母键 D、字母键 F 的顺序循环按键,即 CapsLock、A、S、D、F、CapsLock、A、S…

JavaSE基础知识分享(十三)

今天继续讲Java中的网络编程的知识!写在前面 今天继续讲Java中的网络编程的知识! 网络编程 概述 计算机网络 计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源…

金箱子

我们设 \(f[i][j]\)表示目前前 \(i\) 个宝箱的期望贡献的 \(j\) 次方。 根据题意可得 $f[i][k]=(f[i-1][1]+a[i])^k \cdot p[i]+(f[i-1][1]+b[i])^k \cdot (1-p[i]) $ 这个式子很难处理,不妨用二项式定理优化 优化后式子则为:\(f[i][k]= \sum _{j=0}^{k} C_{k}^{j} \cdot f[i-…

【PHP安全】demo3:最简单的php代码加密方法

当我们说 "PHP代码加密",我理解的是将 PHP 代码进行混淆或加密,以防止源代码被他人轻易阅读或修改。 这种需求通常用于保护商业秘密或加强代码安全性。常见的工具是使用专业的编译器和加密工具。 然而,请注意,完全保护代码是不可能的,因为最终服务器仍然需要能够…

博客园-awescnb插件-geek皮肤优化--公众号卡片

简介 博客园-awescnb插件-geek皮肤暂不支持配置展示公众号二维码,此文章目的使用手动注入方式自定义实现公众号卡片效果 效果展示公众号卡片动态效果鼠标移入前为公众号指引页 鼠标移入后显示公众号二维码 切换动画为动态反转首页展示实现在博客日历元素blog-calendar前插入自…

Flannel Wireguard 模式

Flannel Wireguard 模式Flannel WireGuard 模式 一、环境信息主机 IPubuntu 172.16.94.141软件 版本docker 26.1.4helm v3.15.0-rc.2kind 0.18.0clab 0.54.2kubernetes 1.23.4ubuntu os Ubuntu 20.04.6 LTSkernel 5.11.5 内核升级文档二、安装服务 kind 配置文件信息 $ cat ins…

统一多层网关好处多,阿里云云原生 API 网关打造全能型网关

本文整理自阿里云云原生 API 网关的公测直播,分享了作为一款全能型网关【云原生 API 网关】是如何帮助企业落地统一网关架构的。作者:问思、望宸 网关承载了业务开发和后端运维的诸多需求,例如路由管理、流量调度、API 管理、入口安全管理等,另外网关侧也需要结合服务治理来…

Kubernetes: client-go 源码剖析(一)

kubernetes:client-go 系列文章:Kubernetes: client-go 源码剖析(一) Kubernetes: client-go 源码剖析(二)0. 前言 在看 kube-scheduler 组件的过程中遇到了 kube-scheduler 对于 client-go 的调用,泛泛的理解调用过程总有种隔靴搔痒的感觉,于是调转头先把 client-go 理…

python03-标准库 第三方库-pathlib模块

python标准库:Python自带的一组模块和库,这些模块和库提供了Python编程所需的基础功能和工具 https://docs.python.org/zh-cn/3/library/index.html?eqid=8ca0b3ea000067990000000264800802Python包索引:即PyPI(Python Package Index),是一个仓库,存放了许多可以通过pi…