机器学习 | 降维问题

news2024/11/25 7:02:42

目录

一、主成分分析

二、奇异值分解

2.1 奇异值分解原理

2.2 奇异值分解实践

三、特征值与特征向量


一、主成分分析

主成分有如下特征:

  • 每个主成分是原变量的线性组合;
  • 各个主成分之间互不相关;
  • 主成分按照方差贡献率从大到小依次排列;
  • 所有主成分的方差贡献率求和为1;
  • 提取后的主成分通常小于原始数据变量的数量;
  • 提取后的主成分尽可能地保留了原始变量中的大部分信息。

我们仍以经典的鸢尾花数据集对主成分分析进行介绍。

通过导入PCA进行主成分分析。

#导入库
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

#导入数据
data=load_iris()

#主成分分析
model=PCA()
model.fit(data.data)

#显示主成分信息
pd.DataFrame(model.transform(data.data),columns=["PC{}".format(x+1) for x in range(data.data.shape[1])])

 

上述结果给出了鸢尾花数据集的4个(全部)主成分,然而选择几个主成分需要进一步判断。这里可以通过计算主成分的累计贡献率进行判断,代码如下:

import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
plt.plot([0]+list(np.cumsum(model.explained_variance_ratio_)),"-")
plt.xlabel("Number of principal componets")
plt.ylabel("Cumulative contribution rate")
plt.show()

 从上图可以看出,主成分从0~1时非常陡峭,而从1往后区域平缓,因此,针对4维鸢尾花数据,我们只需要保留1个主成分,即将原4维数据降维到现在的1维。

利用下面的代码,我们可以用更加量化的方式查看主成分累积贡献率。

model.explained_variance_ratio_

 结果显示,1个主成分就已经达到了92.46%,保留了原数据中绝大部分信息。

综上,主成分分析的全部代码如下:

#导入库
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

#导入数据
data=load_iris()

#主成分分析
model=PCA()
model.fit(data.data)

#显示主成分信息
pd.DataFrame(model.transform(data.data),columns=["PC{}".format(x+1) for x in range(data.data.shape[1])])

#绘制主成分的累积贡献率的折线图
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
plt.plot([0]+list(np.cumsum(model.explained_variance_ratio_)),"-")
plt.xlabel("Number of principal componets")
plt.ylabel("Cumulative contribution rate")
plt.show()

#量化主成分的累计贡献率
model.explained_variance_ratio_

二、奇异值分解

2.1 奇异值分解原理

奇异值分解(SVD)将一个任意矩阵进行分解,无须考虑特征值分解时需要矩阵是方阵的前提。

假设矩阵M是一个m\times n阶矩阵,则可以将其分解为下面的三个矩阵相乘:M=U\varepsilon V^{T}

其中:

  • U是m\times n阶正交矩阵,UU^{T}=II为单位矩阵;
  • V^{T}n\times n阶正交矩阵,VV^{T}=I
  • \varepsilonm \times m阶非负实数对角矩阵,\varepsilon =diag(\sigma _{1},\sigma _{2},...,\sigma _{n}),\sigma _{1}\geq \sigma _{2}\geq ...\geq \sigma _{n}

这种将矩阵M分解的方法就被称为奇异值分解,\varepsilon矩阵上对角线上的元素即为M的奇异值。

考虑一个m> n的任意矩阵,此时\varepsilon的秩为n,矩阵中不同深度的灰色表示奇异值大小不同,对角线上的奇异值(假设存在n个非零的奇异值)依次从大到小进行排列。在这种情况下,矩阵U的最后m-n列失去了意义。

因此可以做进一步的变化,此时m \times m阶的矩阵U变为m \times n阶的矩阵U_{1}m \times n阶的矩阵\varepsilon变为n \times n阶的矩阵\varepsilon_{1}

当我们取k<n,比如k=2时,即认为前两个奇异值占总奇异值之和的比例非常大,因此可以如下图进行运算,尽管此时M_{2}\neq M,但是由于删除的奇异值占比很小,我们可以认为M_{2}\approx M

2.2 奇异值分解实践

利用python可以很方便实现对矩阵的奇异值分解,例如对4 \times 5阶的矩阵M进行奇异值分解:

M=\begin{bmatrix} 1 & 0 & 0 & 0 & 2\\ 0& 0 & 3 &0 &0 \\ 0& 0 & 0 &0 &0 \\ 0&4 &0 &0 &0 \end{bmatrix}

 代码如下:

import numpy as np
M=np.array([[1,0,0,0,2],[0,0,3,0,0],[0,0,0,0,0],[0,4,0,0,0]])
U,Sigma,VT=np.linalg.svd(M)
print("U:",U)
print("Sigma:",Sigma)
print("VT:",VT)

 导入一张图片,下面的代码给出了地秩近似序列使用奇异值分解逼近的图片。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

r_max=300  #设置最大的秩
Pic="C:\\Users\\LEGION\\Pictures\\Saved Pictures\\暨大logo.png"

image=Image.open(Pic).convert("L")
img_mat=np.asarray(image)

U,s,V=np.linalg.svd(img_mat,full_matrices=True)
s=np.diag(s)

for k in range(r_max+1):
    approx=U[:,:k] @ s[0:k,:k] @ V[:k,:]
    img=plt.imshow(approx,cmap='gray')
    plt.title("SVD approximation with degree of %d"%(k))
    plt.plot()
    plt.pause(0.001)
    plt.clf()

三、特征值与特征向量

利用python与Numpy库,很容易得到一个矩阵的特征值和特征向量。

import numpy as np
A=np.array([[1,2],[3,4]])
a,b=np.linalg.eig(A)
print("A的特征值为:\n",a)
print('A的特征向量为:\n',b)

 

通过np.lianlg.eig()函数得到的特征向量是已经标准化的向量, 即长度为1.改函数给出的特征值未按大小顺序排序。

除了特征值和特征向量外,协方差矩阵与相关系数矩阵也是降维分析中的重要概念。以鸢尾花的4个特征向量为例,协方差矩阵的每个元素是各个向量元素之间的协方差,相关系数矩阵的各元素是由各特征间的相关系数构成的。

import numpy as np
from sklearn.datasets import load_iris

#导入数
data=load_iris()
X=data.data

Cov_X=np.cov(X.T)  #求解协方差矩阵
Cor_X=np.corrcoef(X.T)  #求解相关系数矩阵

print("协方差矩阵:\n",Cov_X)
print("相关系数矩阵:\n",Cor_X)

利用协方差矩阵和相关系数矩阵可以求解主成分。这里以利用协方差矩阵为例进行说明。

沿用上面的协方差矩阵数据,可以求得其特征值和特征向量:

import numpy as np
from sklearn.datasets import load_iris

#导入数
data=load_iris()
X=data.data

Cov_X=np.cov(X.T)  #求解协方差矩阵

a,b=np.linalg.eig(Cov_X)
print("协方差矩阵的特征值为:\n",a)
print('协方差矩阵的特征向量为:\n',b)

协方差矩阵的特征值即为主成分的方差贡献率:

4.2282/(4.2282+0.2427+0.0782+0.0238)=0.9246

0.2427/(4.2282+0.2427+0.0782+0.0238)=0.05310.0782/(4.2282+0.2427+0.0782+0.0238)=0.01710.0238/(4.2282+0.2427+0.0782+0.0238)=0.0052

第一个主成分(解释方差)所占比例已经高达92.46%,说明已经可以在这个比例上解释原始数据信息,因此可以将鸢尾花数据从四维降至一维。第一主成分如下:

Y_{1}=0.3614\times(x_{1}-\bar{x}_{1})-0.0845\times(x_{2}-\bar{x}_{2})+0.8567\times(x_{3}-\bar{x}_{3})+0.3583\times(x_{4}-\bar{x}_{4})

其中,\bar{x}_{i}(i=1,2,3,4)表示该列特征的均值,等式右边的系数为协方差矩阵的特征向量的第一列(与第一个特征值相对应的数值)。 

除了协方差矩阵,相关系数矩阵也可以求解主成分。但是两种不同的求解方法结果通常会有一定的差别。此外,值得注意的是,如果对已经标准化的数据求协方差矩阵,实际上就是对原变量求相关系数矩阵。

在求解主成分时,如果变量间的单位不同,应该先将变量标准化后进行计算。否则由于单位不同导致的取值范围悬殊太大会影响最终的结果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【诗视野文学社】五一特刊|本期诗人:胭脂茉莉 李本 薛宏 文爱艺 唐根金 王宁 迪夫 东楠灵

【诗视野文学社】五一特刊 本期诗人&#xff1a;胭脂茉莉 李本 薛宏 文爱艺 唐根金 王宁 迪夫 东楠灵 脂茉莉简介&#xff1a;刘彦芹&#xff0c;女&#xff0c;作家、诗人&#xff0c;江苏人&#xff0c;年少习诗&#xff0c;评论及随笔见诸媒体及报刊&#xff0c;诗歌被选入海…

中国人民大学与加拿大女王大学金融硕士引领你走出职场困境,勇往直前!

走到一定职位时&#xff0c;想更进一步基本无望&#xff0c;到了自己事业的瓶颈期。从底层一路冲到中层靠的是能力&#xff0c;靠的是忠诚&#xff0c;靠的是勤奋&#xff0c;而再向上走&#xff0c;该凭借什么&#xff0c;完全找不到方向。而那些极个别的人却在自己看不到的地…

基于PySpark的10亿级数据集LAION-5B元数据快速处理实践(全文分享)

推荐语 多模态大模型训练如火如荼展开&#xff0c;但以LAION-5B为代表的大规模多模态数据集获取却成了一个令人头疼的问题。 OpenDataLab两位工程师在浦数 AI Talk做了非常实用的LAION-5B下载经验分享&#xff0c;我们整理了其演讲内容、Parquet文件、图片下载工具&#xff0…

Hive执行计划之一文读懂Hive执行计划

目录 文章目录 概述1.hive执行计划的查看2.学会查看Hive执行计划的基本信息3.执行计划步骤操作过程4.explain extended 概述 Hive的执行计划描述了一个hiveSQL语句的具体执行步骤&#xff0c;通过执行计划解读可以了解hiveSQL语句被解析器转换为相应程序语言的执行逻辑。通过…

软件测试人员迷茫之中如何找到职业发展的方向?

出现迷茫或焦虑的原因是什么&#xff1f; 也许每个人的原因不一样&#xff0c;但不外乎是下面这些原因叠加的结果。 1、敏捷和DevOps开发模式的推行&#xff0c;虽然20年的历史是否已经证明“敏捷已经失败了” 暂且不管&#xff0c;但敏捷/DevOps之风刮的还是很厉害&#xff0c…

每日一练 | 华为认证真题练习Day53

1、现在有以下10.24.0.0/24&#xff0c;10.24.1.0/24&#xff0c;10.24.2.0/24&#xff0c;10.24.3.0/24四个网段&#xff0c;这四个网段可以汇总为以下哪个网段&#xff1f;&#xff08;多选&#xff09; A. 10.24.0.0/23 B. 10.24.1.0/23 C. 10.24.0.0/22 D. 10.24.0.0/2…

Window环境rabbitmq安装教程

首先我们需要取官网下载对应的两个安装包 第一个是rabbitmq安装包路径在括号里&#xff08;Installing on Windows Manually — RabbitMQ&#xff09; 我们选择window下载即可。 下图是下载的样子&#xff0c;确认是这两个就没问题了 第二个是erlang&#xff08;http://erlang…

上海市计算机学会竞赛平台五月月赛题目汇总

我又来了&#xff01; 爆切了一大堆没用的水题后&#xff0c;我终于来发题解啦&#xff01;&#xff01;&#xff01; T1原题https://iai.sh.cn/problem/792 我们考虑通过计算最长上升连续自然数串&#xff08;是这么叫的吗&#xff09;来获取答案 可以开两个数组 和 来计…

从飞书妙记秒开率提升,看火山引擎A/B测试在研发场景的应用

作者&#xff1a;DataTester 用户体验是决定互联网产品能否长久生存的关键&#xff0c;每一个基于产品功能、使用和外观的微小体验&#xff0c;都将极大地影响用户留存和满意度。 对于企业协作平台飞书而言&#xff0c;用户体验旅程从打开产品页面的一瞬间就已开始&#xff0c;…

如何安装多个node版本(使用nvm)

1、卸载之前安装的所有node 2、下载nvm安装包&#xff0c;下载地址https://nvm.uihtm.com/ 3、安装nvm 4、打开cmd&#xff0c;运行命令 nvm install node版本号&#xff0c;安装对应版本的node 5、打开nvm的安装路径&#xff0c;可以看到安装的对应的node版本的文件夹 6、若有…

K8S之Deployment控制器管理应用(十一)

Deployment介绍 Deployment是最常用的K8s工作负载控制器&#xff08;Workload Controllers&#xff09;&#xff0c; 是K8s的一个抽象概念&#xff0c;用于更高级层次对象&#xff0c;部署和管理Pod。 Deployment的主要功能&#xff1a; • 管理Pod&#xff0c;即应用程序 •…

CS1237 数据实测

目录 硬件 测试数据 结论 性能 转换时间 硬件 外部电阻电位器 模拟 传感器信号 测试数据 一下记录数据为ADC原始数据未经过软件滤波 跳动幅度图片DEV_FREQUENCY_10DEV_PGA_1751DEV_FREQUENCY_40DEV_PGA_11562DEV_FREQUENCY_640DEV_PGA_18243DEV_FREQUENCY_640DEV_PGA_644…

Spring:什么是SpringBoot框架?①

前言&#xff1a; 我们说任何一个阶段的技术更迭都是在代码量&#xff0c;代码简洁度&#xff0c;封装后复杂关注度降低上下功夫&#xff0c;不断提升生产力。 Spring已经足够牛了&#xff0c;它的bean容器思想启迪和影响了众多的程序员&#xff0c;奠基引领了技术的发展。 在应…

人工智能直播的趋势分析报告

人工智能直播是指通过人工智能技术来模拟真人直播&#xff0c;通过机器学习和自然语言处理等技术实现。随着人工智能技术的不断发展&#xff0c;人工智能直播在近年来得到了广泛应用。 一、人工智能直播的优势 节省成本&#xff1a;相比传统直播&#xff0c;人工智能直播不需要…

校园垃圾回收处理APP

摘 要&#xff1a;本文开发的是校园垃圾分类回收APP。随着互联网的快速发展&#xff0c;现如今使用互联网对信息进行管理这一方法也被各行各业所使用&#xff0c;因为实现信息管理最好的方式就是建立良好的网络管理平台&#xff0c;并对其进行综合管理。与此同时&#xff0c;A…

C++模板类及其应用

C模板类及其应用 在本文中&#xff0c;我们将探讨C中的模板类及其应用。模板类是一种通用的编程技术&#xff0c;它允许您创建可重用的代码&#xff0c;同时保持类型安全和高性能。我们将通过以下几个方面来介绍模板类&#xff1a; 文章目录 C模板类及其应用什么是模板类&…

tomcat集群下的session共享和负载均衡(apache实现)

环境 操作系统&#xff1a;windows tomcat1&#xff1a;Apache Tomcat/7.0.52&#xff08;8085&#xff09; tomcat2&#xff1a;Apache Tomcat/7.0.52&#xff08;8086&#xff09; jdk&#xff1a;1.8.0_251 apache-http&#xff1a;httpd-2.2.17-win32-x86-no_ssl&#xff0…

rabbitmq集群搭建

rabbitmq集群 环境初始化配置集群配置集群节点通信配置节点加入集群 常用命令集群搭建避坑 节点IPrabbitmq01&#xff08;磁盘节点&#xff09;192.168.200.80rabbitmq02&#xff08;内存节点&#xff09;192.168.200.81rabbitmq03&#xff08;内存节点&#xff09;192.168.200…

【Android开发基础】四大组件之一Service(服务)的应用场景及使用(以实时聊天为例)

文章目录 一、引言1、什么是服务&#xff1f;2、应用场景3、其他类同 二、生命周期三、基础使用1、创建服务2、注册服务3、启动服务 四、进阶使用&#xff08;实时聊天&#xff09;1、实现效果2、数据流图3、服务部分 一、引言 1、什么是服务&#xff1f; Service&#xff08;…

路径规划算法:基于海洋捕食者优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于海洋捕食者优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于海洋捕食者优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…