首页 > 编程语言 >Python数据降维之PCA主成分分析【附代码】

Python数据降维之PCA主成分分析【附代码】

时间:2024-03-17 16:04:38浏览次数:34  
标签:PCA Python 降维 人脸 import pca 数据

目录

1、数据降维

(1)PCA主成分分析原理介绍

1、二维空间降维

2、二维空间降维

3、n维空间降维

(2)PCA主成分分析代码实现

1、二维空间降维Python代码实现

2、三维空间降维Python代码实现

2、案例 - 人脸识别模型

(1)背景

(2)人脸数据读取、处理与变量提取

1、读取人脸照片数据

2、人脸数据处理 - 特征变量提取

(3)数据划分与降维

1、划分训练集和测试集

2、PCA数据降维

(4) 模型的搭建与使用

1、模型搭建

2、模型预测

3、模型对比(数据降维与不降维)


1、数据降维

       降维的方法主要有两种:选择特征抽取特征选择特征即从原有的特征中挑选出最佳的特征,抽取特征即将数据由高维向低维投影,进行坐标的线性转换。PCA主成分分析即为典型的抽取特征的方法,它不仅是对高维数据降维,更重要的是经过降维去除噪声,发现数据中的模式。这一节主要介绍PCA主成分分析的基本原理,并通过简单案例来讲解如何通过Python来实现PCA主成分分析。

(1)PCA主成分分析原理介绍

1、维空间降维

       假设在二维坐标系上有一组数据,分别是A(1, 1),B(2, 2),C(3, 3),我们的目的就是把这一组二维数据转换为一维数据。

2、维空间降维

       如果需要将这组数据从二维降至一维,我们可以将"y = x"这一条直线作为新的坐标轴,在下图右边新的坐标体系中,只有一条横轴x',而不再具有纵轴了,这样就把原来的二维数据转换为一维数据了,点A(1, 1)就变成了2√2这一个一维坐标了,点B(2, 2)就变成了2√2这个一维坐标了。

       在实际进行数据降维前首先需要对特征数据零均值化,即对每个特征维度的数据减去该特征的均值。

       对于二维到一维的数据降维,其本质就是在将原始数据零均值化后,寻找下图所示的合适的线性组合系数α和β,来将二维数据转换为一维数据。

3、n维空间降维

       如果原特征变量有n个,那么就是n维空间降维,n维空间降维的思路和二维空间降维的思路是一致的。例如将n维数据(X1,X2,...,Xn )转换为一维数据,就是寻找下图所示的线性组合系数a1、a2……an:

       在实际应用中,Python已经提供了相应的计算库供我们使用,能够快速地帮我们计算出这些系数。分析的是n维向量转成1维向量,那么如何n维向量(X1,X2,...,Xn )转成k维向量(F1,F2,…,Fk)呢,即将n个特征降维成k个新特征?只是从构造1个线性组合变为构造k个线性组合,如下图所示:

       其中需要满足的线性代数条件如下所示,供感兴趣的读者参考:

(1) 每个 主成分的系数平方和为 1 :

           (2) 各个主成分互不相关:

           (3) 主成分的方差依次递减,重要性依次递减:

(2)PCA主成分分析代码实现

1、二维空间降维Python代码实现

       使用PCA的python代码:

import numpy as np
from sklearn.decomposition import PCA
X = np.array([[1, 1], [2, 2], [3, 3]])
pca = PCA(n_components=1)
pca.fit(X) 
X_transformed = pca.transform(X)  

       降维后的结果X_transformed打印出来如下所示:

array([[-1.41421356],
       [ 0.        ],
       [ 1.41421356]])

       提到数据降维其实是通过线性组合完成的,那么如何通过Python程序来获取线性组合中的系数呢,可以使用如下代码获得:

pca.components_  

       将pca.components_打印出来,如下所示:

array([[0.70710678, 0.70710678]])
2、三维空间降维Python代码实现

       在根据已有的信用卡持有人信息及其违约数据来建立信用卡违约评判模型时,数据可能包含申请人的收入,年龄,性别,婚姻状况,工作单位等数百个维度的数据。此处为教学演示,我们选择年龄(岁),负债比率,月收入(元) 三个维度的数据使用PCA进行降维。

       这里首先使用pandas库构建待降维的不同申请人的三维数据:

import pandas as pd
X = pd.DataFrame([[45, 0.8, 9120], [40, 0.12, 2600], [38, 0.09, 3042], [30, 0.04, 3300], [39, 0.21, 3500]], columns=['年龄(岁)', '负债比率', '月收入(元)'])
from sklearn.preprocessing import StandardScaler
X_new = StandardScaler().fit_transform(X)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X_new)  
X_transformed = pca.transform(X_new) 

       使用pca.components_获取线性组合中的系数:应为PCA(n_components=2)打印出来的pca.components_有两行:

array([[ 0.52952108,  0.61328179,  0.58608264],
       [-0.82760701,  0.22182579,  0.51561609]])

2、案例 - 人脸识别模型

(1)背景

       人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术。该技术蓬勃发展,应用广泛,例如:人脸识别门禁系统,刷脸支付软件,公安人脸识别系统。这一节我们便以一个人脸识别模型来讲解如何在实战中应用PCA主成分分析算法。该节所讲的人脸识别的本质其实是根据每张人脸不同像素点的颜色不同来进行数据建模与判断,人脸的每个像素点的颜色都有不同的值,这些值可以组成人脸的特征向量们,不过因为人脸上的像素点过多,所以特征变量过多,因此需要利用PCA进行主成分分析进行数据降维。

(2)人脸数据读取、处理与变量提取

1、读取人脸照片数据

       首先从照片数据集中导入所需要识别的人脸照片,该数据集含有40个人的照片,每人10张,共400张。这里使用的数据集是纽约大学公开的Olivetti Faces人脸数据库,其网址为:https://cs.nyu.edu/~roweis/data/olivettifaces.gif,原图是一张图,笔者将其拆分成400张jpg格式的图方便之后使用。

       在Python中打开这些图片然后进行识别:

import os
names = os.listdir('olivettifaces')

       第2行代码使用os库的listdir()方法返回指定的文件夹中包含的文件或文件夹的名字的列表,这里的olivettifaces文件夹就是存储400张人脸照片的文件夹,这里使用的是文件相对路径。通过names[0:5]展示前五项结果:

第一部分是该张照片对应的人脸编号

第二部分是固定分隔符"_"

第三部分是该张照片在该人脸10张照片中的顺序编号

第四部分是文件的后缀".jpg"

       通过如下代码在Python中查看这些图片:

from PIL import Image
img0 = Image.open('olivettifaces\\' + names[0])
img0.show()
2、人脸数据处理 - 特征变量提取

       已经可以读取人脸图片后,我们需要将人脸图片转换成机器学习比较好处理的数值类型数据,这些数字就是我们之后用来训练模型的特征变量X。这里处理人脸的方式和第七章处理手写数字图片的方式非常类似,都是根据人脸各个地方颜色的不同,获取其地方颜色的数值(颜色是有数值的,不同颜色的值不同),从而将图片转换为数字

import numpy as np
img0 = img0.convert('L')
img0 = img0.resize((32, 32))
arr = np.array(img0)

       此时如果觉得如果觉得numpy格式的arr不好观察,则可以通过pandas库将其转为DataFrame格式进行观察,代码如下:

import pandas as pd
pd.DataFrame(arr)
arr = arr.reshape(1, -1)
print(arr.flatten().tolist())

       演示完第一张人脸图片是如何将图片数据转换为数值数据后,我们就可以通过for循环将所有人脸图片都转换成数值数据,从而构造相应的特征变量了,代码如下:

X = []  # 特征变量
for i in names:
    img = Image.open('olivettifaces\\' + i)
    img = img.convert('L')
    img = img.resize((32, 32))
    arr = np.array(img)
    X.append(arr.reshape(1, -1).flatten().tolist())

       二维表格如下图所示:

3、人脸数据处理 - 目标变量提取

       其中names[0]为第一张图片的文件名:10_0.jpg,split()函数根据“_”符号将文件名分割为两部分,通过[0]提取第一部分,也即人的编号:10。因为split()函数分割完是以字符串形式保存,但是目标变量y是数字形式的,所以需要通过int()函数将字符串转为数字,代码如下:

print(int(names[0].split('_')[0]))

       通过for循环提取400张人脸图片的目标变量了,代码如下:

y = [] 
for i in names:
    img = Image.open('olivettifaces\\' + i)
    y.append(int(i.split('_')[0]))   
print(y) 

(3)数据划分与降

1、划分训练集和测试

       train_test_split()函数训练集和测试集数据,代码如下:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
2、PCA数据降维

       X共有1024列,也即有1024个特征变量,这么多特征变量可能带来过拟合以及提高模型的复杂度等的问题,因此我们需要对特征变量进行PCA主成分分析降维:

from sklearn.decomposition import PCA
pca = PCA(n_components=100)
pca.fit(X_train)
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)

(4) 模型的搭建与使用

1、模型搭建

       使用K近邻算法分类器进行模型搭建,代码如下:

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier() 
knn.fit(X_train_pca, y_train) 
2、模型预测

       测值和实际值进行对比:

y_pred = knn.predict(X_test_pca) 
print(y_pred) 
import pandas as pd
a = pd.DataFrame() 
a['预测值'] = list(y_pred)
a['实际值'] = list(y_test)

       通过如下代码可以查看测试集的预测准确度:

from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
print(score)
3、模型对比(数据降维与不降维)

       这里还可以比较下数据降维与不降维时的效果对比,不使用数据降维的代码如下所示:

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier() 
knn.fit(X_train, y_train)  
y_pred = knn.predict(X_test)  
from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
print(score)

标签:PCA,Python,降维,人脸,import,pca,数据
From: https://blog.csdn.net/weixin_60476982/article/details/136775261

相关文章

  • 如何系统的学习Python——迭代器和生成器
    在Python中,迭代器(Iterators)和生成器(Generators)是用于处理可迭代对象的重要工具。它们允许你按需产生值,而不是一次性生成所有值,从而在处理大量数据时更加高效。下面是关于迭代器和生成器的详细解释:迭代器(Iterators):可迭代对象:在Python中,可迭代对象是实现了__iter__()方......
  • python一些函数用法
    1、性别defxb(x):ifpd.isnull(x):return"空"elifint(x[-2])%2==1:return"男"elifint(x[-2])%2==0:return"女"else:return"其他"deff(x):returnx.nunique()2、省份defprovince(x):ifstr(x)[0:2]=='11':......
  • 用python写网络爬虫:3.urllib库进一步的使用方法
    文章目录异常处理URLErrorHTTPError设置超时时间链接的解析、构造、合并urlparse方法urlsplit方法urljoin方法urlencode方法parse_qs方法quote方法Robots协议Robots协议的结构解析协议参考书籍在上一篇文章:用python写网络爬虫:2.urllib库的基本用法已经介绍了如......
  • Python基础语法
    Python目录-基础语法注释数据类型数据类型准换字面量变量数据输出数据输入标识符运算符判断语句循环语句注释单行注释#以#号开头,#号和注释内容建议以一个空格隔开多行注释"""以三个双引号引起来三个双信号之中写注释内容"""数据类型Python中常用......
  • Python运行环境的搭建(Window11操作系统)
    1.在浏览器搜索、登录http://www.python.org2.点击Downloads进入下载界面 3.点击DownloadPython3.12.0下载2023年最新版 提示:如果我们直接在此界面下载,下载速度会很慢(一秒十几kb),如果有时间可以选择等待半个小时直到下载完成。如果不想等那么久可以使用IDM(收费),或者迅......
  • harbor命令行-python脚本-调用http API
    因为生产环境没有UI界面,也没有开放端口资源出来,无法通过web界面来管理harbor,故调用harbor提供的httpAPI来获取harbor信息和使用常用的功能。importrequestsimportjsonimporturllib.parsemy_auth=('admin','Lovedan@971220')harbor_addr="https://127.0.0.1"def查询......
  • 全栈的自我修养 ———— python爬虫爬取斗破苍穹小说并保存到文档里!看完保证会灵活使
    如果赶时间请直接看第四大步中的源码,好好看完这篇博客,这里保证大家以后彻底搞懂获得一个网站怎么来爬取!!!!一、准备二、选入合适的爬取的目标1、如何看出网站做了反爬2、合适的网站三、理思路1、选择合适的页面2、选择合适的元素三、爬取1、获取所有章节的链接获取网站上......
  • Dynamo PythonScript 代码速查手册By九哥
    你好,这里是BIM的乐趣,我是九哥今天给大家带来的是我的知识工程的第二套知识库,这套知识库不是教程,是一套完整的笔记,里面包含了大量的Python代码。当然这里也没有实现太多的具体逻辑,单纯的是通过Python在Dynamo中实现一些RevitAPI的方法,我的目的就是省事,写代码的时......
  • AI回答记录:python中有重载与重写的概念吗?
    问:python中有重载与重写的概念吗?GPT4-turbo:在Python中,严格来说没有像其他一些编程语言(如Java、C++)那样的重载(Overloading)机制,但是可以通过其他方式实现类似的功能。Python中有重写(Overriding)的概念。重载(Overloading):Python不支持传统的方法重载,即在同一个类中定义多个同名......
  • Python实战:爬取小红书
    有读者在公众号后台询问爬取小红书,今天他来了。本文可以根据关键词,在小红书搜索相关笔记,并保存为excel表格。爬取的字段包括笔记标题、作者、笔记链接、作者主页地址、作者头像、点赞量。一、先看效果1、爬取搜索页2、爬取结果保存到本地excel表格运行我写的爬虫,......