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

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

时间:2024-08-22 19:25:58浏览次数:9  
标签:acc LDA Python lda train test PCA 数据

全文链接: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。

标签:acc,LDA,Python,lda,train,test,PCA,数据
From: https://www.cnblogs.com/tecdat/p/18374571

相关文章

  • python 04-标准库:pathlib模块
    pathlib模块pathlib模块‌:是面向对象的文件系统路径操作库,提供接口来处理文件路径。Path是主类Path:Path对象表示文件或目录的路径,Path类会自动选择PosixPath或WindowsPath,具体取决于我们的操作系统......
  • Python系列(6)- Python 函数、Python 装饰器
    函数在数学上的定义:给定一个非空的数集A,对A施加对应法则f,记作f(A),得到另一数集B,也就是B=f(A),那么这个关系式就叫函数关系式,简称函数。简而言之,两个变量x和y,如果每给定x的一个值,y都有一个确定的值与其对应,那么我们就说y是x的函数。其中,x叫做自变量,y叫做因变量......
  • python03-标准库 第三方库-pathlib模块
    python标准库:Python自带的一组模块和库,这些模块和库提供了Python编程所需的基础功能和工具https://docs.python.org/zh-cn/3/library/index.html?eqid=8ca0b3ea000067990000000264800802Python包索引:即PyPI(PythonPackageIndex),是一个仓库,存放了许多可以通过pip安装的独......
  • python模块之psutil
    模块介绍psutil是一个Python的跨平台库,用于获取系统和进程的运行状态以及实时信息。它能够方便地访问系统的CPU、内存、磁盘、网络等资源的使用情况。此外,psutil也能够管理和监控进程,非常适合用于系统监控和性能分析等应用。psutil库适用于Python3.x版本,自版本5.0.0起......
  • Python中matplotlib使用4
    在matplotlib中,可以通过绘制“饼图”来展示各类别在总体中所占的比例。1绘制基本“饼图”通过matplotlib中的pie()函数绘制饼图,代码如图1所示。图1绘制基本“饼图”的代码从图1中可以看出,pie()函数的参数y即为要绘制的数据,绘制出的“饼图”如图2所示。图2基本“饼图......
  • Python中定义和使用类的私有属性和方法
    类的私有属性和方法指的是只能在类的内部使用,而不能在类外使用的属性和方法。1单下划线方式在定义类的属性和方法时,在名字前面加一个下划线,此时表示该属性或方法只能在类的内部使用,而不能在类的外部使用,代码如图1所示。图1定义类的私有属性从图1中可以看出,在类Myclass中......
  • Python中类的使用4
    在Python中,如果要编写的类是另一个类的特殊版本,可以使用继承。一个类A继承另一个类B,类A将自动获得类B的所有属性和方法,类B叫做父类,而类A叫做子类。假设有一个类是表示“人”的类,而另一个类是表示“学生”的类,因为“学生”是“人”的特殊版本,因此可以把表示“人”的类当作父类,表......
  • python3脚本批量重命名歌曲文件
    场景:歌曲文件名有些混乱 于是想用个脚本批量重命名这些歌曲文件,可以选择【歌曲名-歌手】或【歌手-歌曲名】规范这些文件名脚本如下:importosimportrefrommutagen.id3importID3,TIT2,TPE1frommutagen.mp4importMP4#替换后歌手分隔符REPLACEMENT_STRING......
  • 【整理快速通道】python语法import速查
    这段文字是特意发送在除了CSDN以外的其他网站的,如果这段文字出现在CSDN里面,则说明该账号为抄袭账号,关键字索引:抄袭千思的文章目录正文文件夹结构模块调用包内模块1.import2.from...import...3.import...as4.from...import*(不推荐)同级两个模块导入from...import动态导入try.......
  • python对于pyinstaller使用的一些随记
    1.虚拟环境中需要安装对应的pyinstaller  pipinstallpyinstaller(该命令后会安装pyinstaller和pyinstaller-hooks-contrib)注意:如果在当前环境下没有pyinstaller,则会在本机电脑的环境变量中的path中去寻找,如果没有则报错。      此处设置可参考:https://blog.csdn.......