PCA(主成分分析)思想及实现

PCA的概念:

PCA是用来实现特征提取的。
特征提取的主要目的是为了排除信息量小的特征,减少计算量等。
简单来说:
当数据含有多个特征的时候,选取主要的特征,排除次要特征或者不重要的特征。
比如说:我们要区分猫和狗。那么,猫和狗是否有胡子就变得尤为重要,这属于主要特征,但是猫和狗的颜色就变得不重要了,这就属于不重要特征了。但是当我们要区分猫的种类的时候,猫的颜色又变成主要特征了。这说明主要特征是相对的,而不是绝对的。而我们要保留那些对结果更重要的特征,减少不重要的特征,这就是主成分分析。

PCA的实现:

PCA算法是如何实现的?

简单来说,就是将数据从原始的空间中转换到新的特征空间中,例如原始的空间是三维的(x,y,z),x、y、z分别是原始空间的三个基,我们可以通过某种方法,用新的坐标系(a,b,c)来表示原始的数据,那么a、b、c就是新的基,它们组成新的特征空间。在新的特征空间中,可能所有的数据在c上的投影都接近于0,即可以忽略,那么我们就可以直接用(a,b)来表示数据,这样数据就从三维的(x,y,z)降到了二维的(a,b)。

问题是如何求新的基(a,b,c)?

一般步骤是这样的:

  1. 对原始数据零均值化(中心化),
  2. 求协方差矩阵,
  3. 对协方差矩阵求特征向量和特征值,这些特征向量组成了新的特征空间。

1.PCA–零均值化(中心化):

只有中心化数据之后,计算得到的方向才能比较好的“概括”原来的数据。
此图形象的表述了,中心化的几何意义,就是将样本集的中心平移到坐标系的原点O上。
(这一步其实也可以没有,但是有了更加锦上添花)
在这里插入图片描述

2.PCA–求协方差矩阵

这里更多是线性代数知识:
协方差就是一种用来度量两个随机变量关系的统计量。
同一元素的协方差就表示该元素的方差,不同元素之间的协方差就表示它们的相关性。
协方差:
在这里插入图片描述
方差:
在这里插入图片描述

协方差的性质:在这里插入图片描述
由定义可看出:在这里插入图片描述
比如,三维(x,y,z)的协方差矩阵:在这里插入图片描述
在这里插入图片描述
协方差矩阵的特点:
• 协方差矩阵计算的是不同维度之间的协方差, 而不是不同样本之间的。
• 样本矩阵的每行是一个样本,每列为一个维度,所以我们要按列计算均值。
• 协方差矩阵的对角线就是各个维度上的方差

特别的,如果做了中心化,则协方差矩阵为(中心化矩阵的协方差矩阵公式):
在这里插入图片描述

3. 对协方差矩阵求特征向量和特征值,这些特征向量组成了新的特征空间。

A为n阶矩阵,若数λ和n维非0列向量x满足Ax=λx,那么数λ称为A的特征值,x称为A的对应于特征值λ 的特征向量。 式Ax=λx也可写成( A-λE)x=0,E是单位矩阵,并且|A-λE|叫做A 的特征多项式。当特征多项式等于0的
时候,称为A的特征方程,特征方程是一个齐次线性方程组,求解特征值的过程其实就是求解特征方
程的解。
对于协方差矩阵A,其特征值( 可能有多个)计算方法为:
在这里插入图片描述
在这里插入图片描述
(这里就是线性代数知识)
接下来进行排序:特征值越大,意味着相关性越大
在这里插入图片描述

PCA–评价模型的好坏,K值的确定

通过特征值的计算我们可以得到主成分所占的百分比,用来衡量模型的好坏。
对于前k个特征值所保留下的信息量计算方法如下:在这里插入图片描述

PCA–PCA降维的几何意义:

我们对于一组数据,如果它在某一坐标轴上的方差越大,说明坐标点越分散,该属性能够比较
好的反映源数据。所以在进行降维的时候,主要目的是找到一个超平面,它能使得数据点的分
布方差呈最大,这样数据表现在新的坐标轴上时候已经足够分散了。
PCA算法的优化目标就是:
① 降维后同一维度的方差最大
② 不同维度之间的相关性为0

PCA算法的优缺点:

优点:

  1. 完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计
    算进行干预,最后的结果只与数据相关,与用户是独立的。
  2. 用PCA技术可以对数据进行降维,同时对新求出的“主元”向量的重要性进行排序,根据需要取前
    面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同
    时最大程度的保持了原有数据的信息。
  3. 各主成分之间正交,可消除原始数据成分间的相互影响。
  4. 计算方法简单,易于在计算机上实现。

缺点:

  1. 如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处
    理过程进行干预,可能会得不到预期的效果,效率也不高。
  2. 贡献率小的主成分往往可能含有对样本差异的重要信息。

PCA的代码实现:

PCA接口实现:

import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]])  #导入数据,维度为4
pca = PCA(n_components=2)   #降到2维
pca.fit(X)                  #训练
newX=pca.fit_transform(X)   #降维后的数据
# PCA(copy=True, n_components=2, whiten=False)
print(pca.explained_variance_ratio_)  #输出贡献率
print(newX)                  #输出降维后的数据

PCA函数实现:

import numpy as np
class PCA():def __init__(self,n_components):self.n_components = n_componentsdef fit_transform(self,X):self.n_features_ = X.shape[1]# 求协方差矩阵X = X - X.mean(axis=0)self.covariance = np.dot(X.T,X)/X.shape[0]# 求协方差矩阵的特征值和特征向量eig_vals,eig_vectors = np.linalg.eig(self.covariance)# 获得降序排列特征值的序号idx = np.argsort(-eig_vals)# 降维矩阵self.components_ = eig_vectors[:,idx[:self.n_components]]# 对X进行降维return np.dot(X,self.components_)# 调用
pca = PCA(n_components=2)
X = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]])  #导入数据,维度为4
newX=pca.fit_transform(X)
print(newX)                  #输出降维后的数据

PCA手动函数实现:

"""
使用PCA求样本矩阵X的K阶降维矩阵Z
"""import numpy as npclass CPCA(object):'''用PCA求样本矩阵X的K阶降维矩阵ZNote:请保证输入的样本矩阵X shape=(m, n),m行样例,n个特征'''def __init__(self, X, K):''':param X,训练样本矩阵X:param K,X的降维矩阵的阶数,即X要特征降维成k阶'''self.X = X       #样本矩阵Xself.K = K       #K阶降维矩阵的K值self.centrX = [] #矩阵X的中心化self.C = []      #样本集的协方差矩阵Cself.U = []      #样本矩阵X的降维转换矩阵self.Z = []      #样本矩阵X的降维矩阵Zself.centrX = self._centralized()self.C = self._cov()self.U = self._U()self.Z = self._Z() #Z=XU求得def _centralized(self):'''矩阵X的中心化'''print('样本矩阵X:\n', self.X)centrX = []mean = np.array([np.mean(attr) for attr in self.X.T]) #样本集的特征均值print('样本集的特征均值:\n',mean)centrX = self.X - mean ##样本集的中心化print('样本矩阵X的中心化centrX:\n', centrX)return centrXdef _cov(self):'''求样本矩阵X的协方差矩阵C'''#样本集的样例总数ns = np.shape(self.centrX)[0]#样本矩阵的协方差矩阵CC = np.dot(self.centrX.T, self.centrX)/(ns - 1)print('样本矩阵X的协方差矩阵C:\n', C)return Cdef _U(self):'''求X的降维转换矩阵U, shape=(n,k), n是X的特征维度总数,k是降维矩阵的特征维度'''#先求X的协方差矩阵C的特征值和特征向量a,b = np.linalg.eig(self.C) #特征值赋值给a,对应特征向量赋值给b。函数doc:https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.eig.html print('样本集的协方差矩阵C的特征值:\n', a)print('样本集的协方差矩阵C的特征向量:\n', b)#给出特征值降序的topK的索引序列ind = np.argsort(-1*a)#构建K阶降维的降维转换矩阵UUT = [b[:,ind[i]] for i in range(self.K)]U = np.transpose(UT)print('%d阶降维转换矩阵U:\n'%self.K, U)return Udef _Z(self):'''按照Z=XU求降维矩阵Z, shape=(m,k), n是样本总数,k是降维矩阵中特征维度总数'''Z = np.dot(self.X, self.U)print('X shape:', np.shape(self.X))print('U shape:', np.shape(self.U))print('Z shape:', np.shape(Z))print('样本矩阵X的降维矩阵Z:\n', Z)return Zif __name__=='__main__':'10样本3特征的样本集, 行为样例,列为特征维度'X = np.array([[10, 15, 29],[15, 46, 13],[23, 21, 30],[11, 9,  35],[42, 45, 11],[9,  48, 5],[11, 21, 14],[8,  5,  15],[11, 12, 21],[21, 20, 25]])K = np.shape(X)[1] - 1print('样本集(10行3列,10个样例,每个样例3个特征):\n', X)pca = CPCA(X,K)

PCA应用——鸢尾花数据集

import matplotlib.pyplot as plt
import sklearn.decomposition as dp
from sklearn.datasets.base import load_irisx,y=load_iris(return_X_y=True) #加载数据,x表示数据集中的属性数据,y表示数据标签
pca=dp.PCA(n_components=2) #加载pca算法,设置降维后主成分数目为2
reduced_x=pca.fit_transform(x) #对原始数据进行降维,保存在reduced_x中
red_x,red_y=[],[]
blue_x,blue_y=[],[]
green_x,green_y=[],[]
for i in range(len(reduced_x)): #按鸢尾花的类别将降维后的数据点保存在不同的表中if y[i]==0:red_x.append(reduced_x[i][0])red_y.append(reduced_x[i][1])elif y[i]==1:blue_x.append(reduced_x[i][0])blue_y.append(reduced_x[i][1])else:green_x.append(reduced_x[i][0])green_y.append(reduced_x[i][1])
plt.scatter(red_x,red_y,c='r',marker='x')
plt.scatter(blue_x,blue_y,c='b',marker='D')
plt.scatter(green_x,green_y,c='g',marker='.')
plt.show()

PCA的一点思考:

正如开头我举的例子,当区分猫狗之间时,PCA将胡子等关键信息作为主要特征,但是当区分猫的种类时,PCA是如何做到在猫中把颜色也作为主要特征?就是说从随着算法目标的改变,如何做到主要特征的改变?
我后来想了想,我觉得PCA是针对数据集中各数据互相之间的差距。当分析猫狗时,数据集中主要是猫和狗,当对数据集中进行PCA时,针对的是方差较大的一些数据特征,但是当分析猫的种类时,数据集中主要是猫,方差较大的数据特征就变成了颜色等主要特征。

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

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

相关文章

【安富莱二代示波器教程】第8章 示波器设计—测量功能

第8章 示波器设计—测量功能 二代示波器测量功能实现比较简单,使用2D函数绘制即可。不过也专门开辟一个章节,为大家做一个简单的说明,方便理解。 8.1 水平测量功能 8.2 垂直测量功能 8.3 总结 8.1 水平测量功能 水平测量方…

深度学习数据更换背景_开始学习数据科学的最佳方法是了解其背景

深度学习数据更换背景数据科学教育 (DATA SCIENCE EDUCATION) 目录 (Table of Contents) The Importance of Context Knowledge 情境知识的重要性 (Optional) Research Supporting Context-Based Learning (可选)研究支持基于上下文的学习 The Context of Data Science 数据科学…

熊猫数据集_用熊猫掌握数据聚合

熊猫数据集Data aggregation is the process of gathering data and expressing it in a summary form. This typically corresponds to summary statistics for numerical and categorical variables in a data set. In this post we will discuss how to aggregate data usin…

IOS CALayer的属性和使用

一、CALayer的常用属性 1、propertyCGPoint position; 图层中心点的位置,类似与UIView的center;用来设置CALayer在父层中的位置;以父层的左上角为原点(0,0); 2、 property CGPoint anchorPoint…

QZEZ第一届“饭吉圆”杯程序设计竞赛

终于到了饭吉圆杯的开赛,这是EZ我参与的历史上第一场ACM赛制的题目然而没有罚时 不过题目很好,举办地也很成功,为法老点赞!!! 这次和翰爷,吴骏达 dalao,陈乐扬dalao组的队&#xff0…

谈谈数据分析 caoz_让我们谈谈开放数据…

谈谈数据分析 caozAccording to the International Open Data Charter(1), it defines open data as those digital data that are made available with the technical and legal characteristics necessary so that they can be freely used, reused and redistributed by any…

数据创造价值_展示数据并创造价值

数据创造价值To create the maximum value, urgency, and leverage in a data partnership, you must present the data available for sale or partnership in a clear and comprehensive way. Partnerships are based upon the concept that you are offering value for valu…

卷积神经网络——各种网络的简洁介绍和实现

各种网络模型:来源《动手学深度学习》 一,卷积神经网络(LeNet) LeNet分为卷积层块和全连接层块两个部分。下面我们分别介绍这两个模块。 卷积层块里的基本单位是卷积层后接最大池化层:卷积层用来识别图像里的空间模…

数据中台是下一代大数据_全栈数据科学:下一代数据科学家群体

数据中台是下一代大数据重点 (Top highlight)Data science has been an eye-catching field for many years now to young individuals having formal education with a bachelors, masters or Ph.D. in computer science, statistics, business analytics, engineering manage…

pwn学习之四

本来以为应该能出一两道ctf的pwn了,结果又被sctf打击了一波。 bufoverflow_a 做这题时libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete会清0变量导致无法写,一直没构造出unsorted bin attack,后面根…

北方工业大学gpa计算_北方大学联盟仓库的探索性分析

北方工业大学gpa计算This is my firts publication here and i will start simple.这是我的第一篇出版物,这里我将简单介绍 。 I want to make an exploratory data analysis of UFRN’s warehouse and answer some questions about the data using Python and Pow…

泰坦尼克数据集预测分析_探索性数据分析-泰坦尼克号数据集案例研究(第二部分)

泰坦尼克数据集预测分析Data is simply useless until you don’t know what it’s trying to tell you.除非您不知道数据在试图告诉您什么,否则数据将毫无用处。 With this quote we’ll continue on our quest to find the hidden secrets of the Titanic. ‘The …

关于我

我是谁? Who am I?这是个哲学问题。。 简单来说,我是Light,一个靠前端吃饭,又不想单单靠前端吃饭的Coder。 用以下几点稍微给自己打下标签: 工作了两三年,对,我是16年毕业的90后一直…

基于PyTorch搭建CNN实现视频动作分类任务代码详解

数据及具体讲解来源: 基于PyTorch搭建CNN实现视频动作分类任务 import torch import torch.nn as nn import torchvision.transforms as T import scipy.io from torch.utils.data import DataLoader,Dataset import os from PIL import Image from torch.autograd…

missforest_missforest最佳丢失数据插补算法

missforestMissing data often plagues real-world datasets, and hence there is tremendous value in imputing, or filling in, the missing values. Unfortunately, standard ‘lazy’ imputation methods like simply using the column median or average don’t work wel…

华硕猛禽1080ti_F-22猛禽动力回路的视频分析

华硕猛禽1080tiThe F-22 Raptor has vectored thrust. This means that the engines don’t just push towards the front of the aircraft. Instead, the thrust can be directed upward or downward (from the rear of the jet). With this vectored thrust, the Raptor can …

Memory-Associated Differential Learning论文及代码解读

Memory-Associated Differential Learning论文及代码解读 论文来源: 论文PDF: Memory-Associated Differential Learning论文 论文代码: Memory-Associated Differential Learning代码 论文解读: 1.Abstract Conventional…

大数据技术 学习之旅_如何开始您的数据科学之旅?

大数据技术 学习之旅Machine Learning seems to be fascinating to a lot of beginners but they often get lost into the pool of information available across different resources. This is true that we have a lot of different algorithms and steps to learn but star…

数据可视化工具_数据可视化

数据可视化工具Visualizations are a great way to show the story that data wants to tell. However, not all visualizations are built the same. My rule of thumb is stick to simple, easy to understand, and well labeled graphs. Line graphs, bar charts, and histo…

Android Studio调试时遇见Install Repository and sync project的问题

我们可以看到,报的错是“Failed to resolve: com.android.support:appcompat-v7:16.”,也就是我们在build.gradle中最后一段中的compile项内容。 AS自动生成的“com.android.support:appcompat-v7:16.”实际上是根据我们的最低版本16来选择16.x.x及以上编…