当前位置: 首页 > news >正文

机器学习---降维算法

知其然知其所以然

    • 【写在前面】
    • 主成分分析(PCA)
      • 原理部分
      • 代码部分
      • 可视化部分
    • 线性判别分析(LDA)
      • 原理部分
      • 代码部分
      • 可视化部分
    • 独立成分分析(ICA)
      • 原理部分
      • 代码部分
      • 可视化部分
    • t-SNE降维算法
      • 原理部分
      • 代码部分
      • 可视化部分

【写在前面】

【以下使用的数据量很少很少,因此在散点图中展示不出具体算法特点,请读者自行实验。】
常用的降维算法有主成分分析(PCA)、线性判别分析(LDA)、独立成分分析(ICA)、t-SNE等。以下是这些算法的Python代码示例,分享一下我对降维的理解:

对一个样本矩阵,一是换特征,找一组新的特征来重新表示;二是减少特征,新特征的数目要远小于原特征的数目。这样一来就可以得到数量少且比较好的几个变量一构建模型。但是,降维也可能会导致信息的损失和模型的过拟合,因此需要谨慎使用。

  1. 创建数据
  2. 创建模型对象
  3. 拟合数据
  4. 转换数据
  5. 输出数据

主成分分析(PCA)

原理部分

  • 通常把转化生成的综合指标称之为主成分
  • 每个主成分都是原始变量的线性组合,且每个主成分之间互不相干
  • 主成分分析(PCA)是一种常用的数据降维技术,它通过线性变换将高维数据转换为低维数据,同时保留原始数据的主要特征。PCA的基本思想是将原始数据映射到一个新的坐标系中,使得新坐标系下数据的方差最大化。这个新坐标系的轴称为主成分,每个主成分都是原始数据中的线性组合。PCA的应用广泛,例如在图像处理、信号处理、模式识别、数据挖掘等领域中都有广泛应用。在数据分析中,PCA可以用于降低数据的维度,减少数据冗余,提高数据处理效率,同时也可以帮助我们发现数据的内在结构和规律,从而更好地理解数据。
  • 在实际应用中,PCA的步骤主要包括数据标准化、计算协方差矩阵、求解特征值和特征向量、选取主成分和投影数据等。通过PCA,我们可以得到一些重要的结果,例如主成分的贡献率、主成分的方差解释比例、主成分的系数等。这些结果可以帮助我们更好地理解数据的结构和特征,从而为后续的数据分析和建模提供更好的基础。

代码部分

from sklearn.decomposition import PCA
import numpy as np# 创建数据
X = np.array([[1, 2, 3, 6, 10, 22, 3, 2, 3], [4, 5, 6, 8, 9, 23, 5, 2, 6], [7, 8, 9, 10, 2, 24, 9, 9, 5]])# 创建PCA对象
pca = PCA(n_components=2)# 拟合数据
pca.fit(X)# 转换数据
X_new = pca.transform(X)print(X_new)

在这里插入图片描述

可视化部分

在这里插入图片描述

线性判别分析(LDA)

原理部分

线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的监督学习算法,它既可以作为分类器,也可以作为降维技术。LDA的主要思想是将数据投影到一个低维空间中,使得不同类别之间的距离最大化,同一类别内部的距离最小化。这样可以在保留尽量多的信息的同时,将数据进行有效的分类。LDA的主要步骤包括:

  1. 计算每个类别的均值向量和整个数据集的均值向量。
  2. 计算类内散度矩阵(within-class scatter matrix)和类间散度矩阵(between-class scatter matrix)。
  3. 计算投影矩阵,将数据投影到低维空间中。
  4. 使用投影矩阵将数据进行降维或分类。

LDA的优点包括:

  1. 在保留尽量多信息的同时,可以将数据进行有效分类。
  2. 可以用于降维,减少数据维度,便于可视化和处理。
  3. 适用于高维数据集。

LDA的缺点包括:

  1. 对于非线性可分的数据集,LDA的效果会受到影响。
  2. 对于不平衡的数据集,可能会导致分类结果出现偏差。
  3. 在计算类内散度矩阵时,需要计算每个类别的协方差矩阵,如果数据维度很高,计算量会很大。

代码部分

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import numpy as np# 创建数据
X = np.array([[1, 2, 3, 6, 10, 22, 3, 2, 3], [4, 5, 6, 8, 9, 23, 5, 2, 6], [7, 8, 9, 10, 2, 24, 9, 9, 5]])
y = np.array([0, 1, 0])# 创建LDA对象
lda = LinearDiscriminantAnalysis(n_components=1)# 拟合数据
lda.fit(X, y)# 转换数据
X_new = lda.transform(X)print(X_new)

在这里插入图片描述

可视化部分

在这里插入图片描述

独立成分分析(ICA)

原理部分

  • 在机器学习中,ICA被广泛应用于信号处理、图像处理、语音识别等领域。
  • ICA的基本思想是:假设存在一组独立的成分,它们通过线性组合形成了观测信号。通过对观测信号进行分解,可以得到独立的成分。
  • ICA的目标是找到一组线性变换,使得变换后的信号成分之间相互独立。
  • ICA的应用场景包括:语音信号分离、图像分离、生物信号分析等。例如,ICA可以用于将多个人说话的混合语音信号分离成单独的语音信号,或者将一张复杂的图像分解为不同的成分。

代码部分

from sklearn.decomposition import FastICA
import numpy as np# 创建数据
X = np.array([[1, 2, 3, 6, 10, 22, 3, 2, 3], [4, 5, 6, 8, 9, 23, 5, 2, 6], [7, 8, 9, 10, 2, 24, 9, 9, 5]])# 创建ICA对象
ica = FastICA(n_components=2)# 拟合数据
ica.fit(X)# 转换数据
X_new = ica.transform(X)print(X_new)

在这里插入图片描述

可视化部分

在这里插入图片描述

t-SNE降维算法

原理部分

  • TSNE(t-Distributed Stochastic Neighbor
    Embedding)是一种非线性降维算法,用于将高维数据降至二维或三维,以便于可视化。
  • 该算法的基本思想是,将高维数据映射到低维空间中,使得在原始空间中相似的数据点在低维空间中也保持相似,而不相似的数据点在低维空间中则距离较远。
  • TSNE算法主要分为两个步骤:首先,通过高斯核函数计算每个数据点与其它数据点之间的相似度,然后将这些相似度转化为概率分布。接着,在低维空间中,通过KL散度最小化的方法,将这些概率分布转化为新的低维空间中的概率分布。最终,通过梯度下降算法,将低维空间中的数据点的位置不断调整,使得其与高维空间中的数据点的相似度尽可能地保持一致。
  • TSNE算法的优点是能够在保持数据点之间的相对距离的同时,有效地将高维数据映射到低维空间中,从而便于可视化和分析。但是,该算法的计算复杂度较高,需要较长的计算时间和计算资源。

代码部分

from sklearn.manifold import TSNE
import numpy as np# 创建数据
X = np.array([[1, 2, 3, 6, 10, 22, 3, 2, 3], [4, 5, 6, 8, 9, 23, 5, 2, 6], [7, 8, 9, 10, 2, 24, 9, 9, 5]])# 创建t-SNE对象
tsne = TSNE(n_components=2)# 转换数据
X_new = tsne.fit_transform(X)print(X_new)

在这里插入图片描述

可视化部分

在这里插入图片描述

http://www.lryc.cn/news/42678.html

相关文章:

  • 【Vue2从入门到精通】详解Vue.js的15种常用指令及其使用场景
  • 数据库知识总结
  • 处理数组循环中删除元素导致索引错位情况
  • 快速排序,分治法实际应用(含码源与解析)
  • linux入门---操作体统的概念
  • 《Qt 6 C++开发指南》提供4个版本的示例程序
  • chartgpt 告诉我的,loss 函数的各种知识
  • 旅行推销员问题的遗传算法中的完整子路线顺序交叉
  • Python实现词频统计
  • 微信小程序面试题(day08)
  • 最强的Python可视化神器,你有用过么?
  • Ubuntu使用vnc远程桌面【远程内网穿透】
  • 【C++】map、set、multimap、multiset的介绍和使用
  • css学习14(多媒体查询)
  • 【C++进阶】C++11(中)左值引用和右值引用
  • Python中的生成器【generator】总结,看看你掌握了没?
  • MD5加密竟然不安全,应届生表示无法理解?
  • 【Linux】虚拟地址空间
  • 四平方和题解(二分习题)
  • 一篇文章搞定js正则表达式
  • [数据结构] 用两个队列实现栈详解
  • 官宣|Apache Flink 1.17 发布公告
  • 动态内存管理+动态通讯录【C进阶】
  • 基于pytorch+Resnet101加GPT搭建AI玩王者荣耀
  • 多线程控制讲解与代码实现
  • 清晰概括:进程与线程间的区别的联系
  • 自定义类型 (结构体)
  • 第14届蓝桥杯STEMA测评真题剖析-2023年3月12日Scratch编程初中级组
  • 程序员接私活一定要知道的事情,我走的弯路你们都别走了
  • 十二届蓝桥杯省赛c++(下)