机器学习_PCA

目录

一、概念

二、原理

三、步骤

 四、实战

1、数据处理——转rgb为灰度图像

2、手动实现pca降维

3、查看信息保留数量

 4、调用第三方库实现pca降维

五、小结


引入:

当说黄河五路和渤海三路交叉口的时候,这些路就类似于我们说的坐标系。而城市中的每一个地方就类似于坐标系中的点,被坐标系唯一标识。 那么问题来了,我想让你把黄河五路渤海三路交叉口这样用两个数字标注的位置信息,转换为只有一个数字标识的位置描述,你怎么办?—— 如果有一条铁路通过了城市,而城市中所有重要的建筑都在铁路边,那么就可以根据距离铁路的起点多远来定义每一个点的位置。那样是不是这个问题就解决了?比如黄河五路渤海三路交叉口距离铁路挺近的,在起点旁边。 其实,这就是一种降维了,把原来的需要两个维度标注的信息,现在用一条铁路就可以搞定。

当然,这样的定位不如用俩个维度来的准,有的地点离铁路远,但是远多少,在新的表示中就没有得到展示了。这说明数据降维不是无损的,会造成信息的部分丢失。

主成分分析方法是一种数据降维的方式,只要数据压缩,必定会损失一些信息,而PCA做的就是尽可能的去找到一些主要的关键特征去区分开数据,去除掉一些对区分数据不大的那些特征,这样,既可以做到降维,也可以尽可能多的保留原来数据的信息。

一、概念

PCA——主成分分析法

属于无监督学习方法,这一方法利用正交变换(也就是对原坐标系做旋转变换)把由线性相关变量表示的观测数据转换为少数几个由线性无关变量表示的数据,线性无关的变量称作主成分。

简单来讲就是通过坐标轴转换对数据进行降维操作。选择坐标轴的依据是尽可能保留原始数据。降维即把数据投影在这个坐标轴上或者几个坐标轴构成的‘平面’上。

二、原理

把数据看成空间中的点,然后尝试去寻找几个方向(例如下图橙色的和下面的PC1PC2), 把这些点进行投影,投影之后让这些点离得尽可能的远。 这样这几个方向就是主成分, 空间中的样本点就可以通过这几个新的方向进行描述了。 但是找的这几个方向也是有要求的,就是互不干扰,没有线性关系,就像x轴和y轴那样,这样才能更好的去描述这些数据。主成分之间没有冗余。

 所以主成分的标准两个条件:

①互不相关。  ②用来描述数据的时候,方差尽可能大。

三、步骤

梳理一下这个过程,然后我们根据一个例子感受一下这个过程,遇到新的数据集X之后(N维),我们想降到K维,PCA是这样做的

  • 首先,应该先把X每一维进行归一化,把均值变成0
  • 然后,计算协方差矩阵C, 即𝐶=1𝑚𝑋𝑛𝑜𝑟𝑚𝑋𝑛𝑜𝑟𝑚𝑇
  • 然后,计算C的特征值和特征向量,把特征值从大到小排列,对应的特征向量从上往下排列
  • 然后,将协方差矩阵相似对角化
  • 然后,去特征向量的前k个,得到K个基
  • 最后,用这K个基与X相乘,得到降维后的K维矩阵Y

下面我们看一个例子,感受一下这个过程:

1、输入数据X: 2个特征,5个训练样本, 并去均值

2、计算协方差矩阵C ,即𝐶=1𝑚𝑋𝑛𝑜𝑟𝑚𝑋𝑛𝑜𝑟𝑚𝑇

3、计算特征值和特征向量 特征值 

4、相似对角化

5、降到1维,那么就取𝑐1作为基,得最后结果


 四、实战

原图如下,对其进行pca降维:

1、数据处理——转rgb为灰度图像

def loadImage(path):img = Image.open(path)# 将图像转换成灰度图img = img.convert("L")width = img.size[0]height = img.size[1]data = img.getdata()# 对数据进行一个缩放,缩小100倍data = np.array(data).reshape(height,width)/100new_im = Image.fromarray(data*100)new_im.show()return data

【输出】

2、手动实现pca降维

def pca(data,k):#param data:  图像数据#param k: 保留前k个主成分n_samples,n_features = data.shape# 求均值mean = np.array([np.mean(data[:,i]) for i in range(n_features)])# 去中心化normal_data = data - mean# 得到协方差矩阵matrix_ = np.dot(np.transpose(normal_data),normal_data)eig_val,eig_vec = np.linalg.eig(matrix_)# print(matrix_.shape)#  print(eig_val)# 第一种求前k个向量#  eig_pairs = [(np.abs(eig_val[i]),eig_vec[:,i]) for i in range(n_features)]#  eig_pairs.sort(reverse=True)#  feature = np.array([ele[1] for ele in eig_pairs[:k]])#  new_data = np.dot(normal_data,np.transpose(feature))# 第二种求前k个向量eigIndex = np.argsort(eig_val)eigVecIndex = eigIndex[:-(k+1):-1]feature = eig_vec[:,eigVecIndex]new_data = np.dot(normal_data,feature)# 将降维后的数据映射回原空间rec_data = np.dot(new_data,np.transpose(feature))+ mean# print(rec_data)# 压缩后的数据也需要乘100还原成RGB值的范围newImage = Image.fromarray(rec_data*100)newImage.show()return rec_data

这里取的保留前十个主成分,得到

3、查看信息保留数量

def error(data,recdata):sum1 = 0sum2 = 0# 计算两幅图像之间的差值矩阵D_value = data - recdata# 计算两幅图像之间的误差率,即信息丢失率for i in range(data.shape[0]):sum1 += np.dot(data[i],data[i])sum2 += np.dot(D_value[i], D_value[i])error = sum2/sum1print(sum2, sum1, error)
23076.032446296413   2261348.8400000017  0.010204543429175834

 4、调用第三方库实现pca降维

import numpy as np
from sklearn.decomposition import PCA
from PIL import Imagedef loadImage(path):...def error(data, recdata):...if __name__ == '__main__':data = loadImage("timg.jpg")pca = PCA(n_components=10).fit(data)# 降维x_new = pca.transform(data)# 还原降维后的数据到原空间recdata = pca.inverse_transform(x_new)# 计算误差error(data, recdata)# 还原降维后的数据newImg = Image.fromarray(recdata*100)newImg.show()# error(data, recdata)

 得到的值跟上面不调库的差不多:

23076.032452099163   2261348.8400000017   0.010204543431741892

五、小结

PCA优势:

1、降低数据维度:可以将高维数据压缩到低维空间,减少数据的存储和计算成本。

2、去除噪声:通过降维可以去除一些噪声和冗余信息,提高数据的质量。

3、可视化数据:将高维数据降维后,可以更直观地观察和分析数据的分布和特征。

但是可能会导致一些重要信息的丢失。

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

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

相关文章

高等数学笔记(三):导数

一、导数概念 1.1 导数的定义 1.1.1 函数在一点处的导数与导函数 1.1.2 单侧导数 1.2 导数的几何意义 1.3 函数可导性与连续性的关系 二、函数的求导法则 2.1 函数的和、差、积、商的求导法则 2.2 反函数的求导法则 2.3 复合函数的求导法则 2.4 基本求导法则与导数公式 三…

read code and make summer (python)

read code and make summer ==标题==:语法==标题==:类的定义==标题==:继承==标题==:多态==标题==:__all__ = [create_dataset, create_dataloader]==标题==:yield==标题==: f-string(格式化字符串)==标题==:getattr()==标题==:logging==标题==:seed==标题==:slice…

必看!!! 2024 最新 PG 硬核干货大盘点(上)

PGConf.dev(原名PGCon,从2007年至2023年)首次在风景如画的加拿大温哥华市举办。此次重新定位的会议带来了全新的视角和多项新的内容,参会体验再次升级。尽管 PGCon 历来更侧重于开发者,吸引来自世界各地的资深开发者、…

Nginx常用配置、反向代理

目录 1. 常用配置 基本设置 HTTP配置 虚拟主机配置 2. 高级配置 反向代理配置 SSL/TLS配置 负载均衡配置 1. 常用配置 基本设置 user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;user nginx;: 指定Nginx worker…

深入理解并打败C语言难关之一————指针(5)(最终篇)

前言: 仔细一想,小编已经把指针的大部分内容都说了一遍了,小编目前有点灵感枯竭了,今天决定就结束指针这一大山,可能很多小编并没有提到过,如果有些没说的小编会在后续博客进行补充道,不多废话了…

服务器数据恢复—NTFS文件系统下双循环riad5数据恢复案例

服务器存储数据恢复环境: EMC CX4-480存储,该存储中有10块硬盘,其中有3块磁盘为掉线磁盘,另外7块磁盘组成一组RAID5磁盘阵列。运维人员在处理掉线磁盘时只添加新的硬盘做rebuild,并没有将掉线的硬盘拔掉,所…

ARCGIS 如何对河流等线条图形进行Smooth处理——具有多个断点高阶版

1.线转点折点(注意!很重要,不是线转点) 2.点转线步骤 ## 3 线的融合 2.1 新建Filed 》短精度类型》利用选择工具的 线文件。全选同一条河流点,进入Tabel的选择界面。给同一条河赋值同一个值。 大功告成!…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及多类型储能调频容量动态申报的电能量与调频市场联合出清方法研究》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

深入探究RTOS的任务调度

阅读引言: 此文将会从一个工程文件, 一步一步的分析RTOS的任务调度实现, 这里选用FreeRTOS分析, 别的也差不多的, 可能在细节上有少许不一样。 目录 1, 常见嵌入式实时操作系统 2, 任务调度的…

HDFS 面试题(一)

1. 简述什么是HDFS,以及HDFS作用 ? HDFS,全称为Hadoop Distributed File System,即Hadoop分布式文件系统,是一个分布式文件系统,由Apache Hadoop项目的一部分。它被设计用来在廉价的硬件上运行&#xff0c…

练习题-18 计算两个积分

计算积分 I ∫ R e − t 4 d t . I\int_{\mathbb{R}} e^{-t^4} dt. I∫R​e−t4dt. 解:令 x t 4 xt^4 xt4. 则 I 2 ∫ 0 ∞ e − x ⋅ 1 4 ⋅ x − 3 / 4 d x 1 2 Γ ( 1 4 ) I 2\int_0^\infty e^{-x} \cdot \frac{1}{4}\cdot x^{-3/4} dx\frac{1}{2} \Gamma(…

SQLite Delete 语句

SQLite Delete 语句 SQLite 的 DELETE 语句用于从表中删除数据。它是 SQL 数据库管理中非常基础且重要的操作之一。在使用 DELETE 语句时,可以删除表中的特定行,也可以删除整个表的数据。本文将详细介绍 SQLite 中的 DELETE 语句,包括其语法…

【机器学习】第11章 神经网络与深度学习(重中之重)

一、概念 1.神经元模型 (1)神经网络的基本组成单位 (2)生物上,每个神经元通过树突接受来自其他被激活神经元的信息,通过轴突释放出来的化学递质改变当前神经元内的电位。当神经元内的电位累计到一个水平时…

Linux虚拟化技术概览:从KVM到Docker

Linux虚拟化技术是现代数据中心和云基础设施的核心组成部分,它允许在同一台物理服务器上运行多个独立的操作系统实例,从而提高资源利用率、灵活性和安全性。从KVM到Docker,Linux虚拟化经历了从传统虚拟机到轻量级容器的演进,下面是…

时间戳转时间格式小记——个位数月份 如何去掉补位0的情况

工作中遇到的问题小记一下 时间戳:1710172800 时间格式:2024-03-12 00:00:00 在无要求的情况下这种情况很OK 当我们需要时间格式为:2024-3-12 00:00:00 那常规情况就不适用 解决: import time sjc 1710172800 # Windows 环境…

Kubernetes Dashboard

Dashboard Dashboard 的项目网站,可以查看说明文档和基本的使用情况。 下载yaml wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml注意需要修改镜像,不然可能会拉去不下来镜像 cat recommended.yaml…

人工智能--自然语言处理NLP概述

欢迎来到 Papicatch的博客 目录 🍉引言 🍈基本概念 🍈核心技术 🍈常用模型和方法 🍈应用领域 🍈挑战和未来发展 🍉案例分析 🍈机器翻译中的BERT模型 🍈情感分析在…

【C++】编程核心概念——核心特征

C编程核心概念 在C中,封装、继承和多态是面向对象编程的三大核心概念(特征)。这些特性为程序员提供了一种创建和管理复杂系统的方法,同时保持了代码的模块化、可重用性和可扩展性。下面分别解释这三个概念的作用: 封装…

java kotlin 命令行解析

在 Java 中解析命令行字符串可以使用以下几种方法: 1. 使用 args 参数 当程序启动时,主方法(main 方法)会接收一个 String 数组作为参数,即 args。这些参数就是从命令行传递过来的。 示例代码: object …

Ansible——template模块

目录 基本参数 选项参数 高级参数 基本用法 示例: 示例一:Nginx 配置 1. 目录结构 2. 模板文件:nginx.conf.j2 3. Playbook 文件:deploy_nginx.yml 4. 执行 Playbook 示例二:MySQL 配置 1. 目录结构 2. …