PCA(主成分分析法—Principal Component Analysis)

  • 一. 求数据的前n个主成分
  • 二. 高维数据映射为低维数据

一. 求数据的前n个主成分

紧接着上次汇报的内容:


⟶将周围离散的点分别映射到这条直线上\stackrel{将周围离散的点分别映射到这条直线上}{\longrightarrow}⟶将周围离散的点分别映射到这条直线上​
该直线所在的轴为我们的第一主成分,得到的结果就是这些样本点直接距离的方差是最大的

显然我们现在所求的不仅仅是局限在二维空间中,当维数增加时,我们如何求得下一个主成分

如左图所示,原来求直线向量:X(i)⋅w=∥X∥project(i)X^{(i)}\cdot w=\left \| X\right \|_{project}^{(i)}X(i)⋅w=∥X∥project(i)​ Xproject(i)=∥Xproject(i)∥⋅WX^{(i)}_{project} = \left \| X^{(i)}_{project}\right \|\cdot WXproject(i)​=∥∥∥​Xproject(i)​∥∥∥​⋅W
新求得的分量为(即图中绿色向量):X′(i)=X(i)−Xproject(i)X^{'(i)} = X^{(i)} - X^{(i)}_{project}X′(i)=X(i)−Xproject(i)​

其实道理是一样的:数据需要进行改变,将其在第一主成分上的分量去掉即可,原理为上方第二个图。

下面我们来编程实现这个前N个主成分的代码:

import numpy as np
import matplotlib.pyplot as plt            #导入我们所需要的包X=np.empty((100,2))                        #随机创建一个我们需要的二维数组
X[:,0] = np.random.uniform(0.,100.,size=100)
X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0.,10.,size=100)def demean(X):                             #将X数据均值归一化return X-np.mean(X,axis= 0)
X_demean = demean(X)
def f(w,X):                                #下面的步骤与之前的求简单二维PCA一模一样return np.sum((X.dot(w)**2))/len(X)
def df(w,v):return X.T.dot(X.dot(w))*2. / len(X)
def direction(w):return w / np.linalg.norm(w)
def first_component(X,initial_w,eta,n_iters = 1e4,epsilon=1e-8): #梯度上升法w = direction(initial_w)cur_iter = 0while cur_iter < n_iters:gradient = df(w,X)last_w = ww = w + eta *gradientw = direction(w)if (abs(f(w,X) - f(last_w,X)) < epsilon):breakcur_iter += 1return w
initial_w = np.random.random(X.shape[1])
eta = 0.001
result=first_component(df_math,X_demean,initial_w,eta)
print(result)                           #此后我们设法减去第一主成分上的分量
X2 = np.empty(X.shape)
for  i in range(len(X)):X2[i] = X[i] - X[i].dot(w) * w
w2 = first_component(X2,initial_w, eta)
print(w2)                               #此时输出的值如果和原来W相乘 结果为0(因为2个垂直向量的乘积为0)
print(w.dot(w2))                        #若结果为0  则该算法没毛病
#接下来我们尝试可以自己定义N的个数的N维度主成分分析法def first_n_component(n , X, eta = 0.01, n_iters = 1e4, epsilon=1e-8):X_pca = X.copy()X_pca = demean(X_pca)res = []for i in range(n):initial_w = np.random.random(X_pca.shape[1])w = first_component(X_pca, initial_w, eta)res.append(w)X_pca = X_pca - X_pca.dot(w).reshape(-1,1) * w return res
#我们还是以二维的数据来验证一下
print(first_n_component(2, X))

二. 高维数据映射为低维数据

上述所求虽然实现了多维数据主成分轴所在向量,但是数据仍然是高维的,如何对数据进行降维处理?
我们先从矩阵入手:

假设 X 数据有m个样本,n个特征 此时 W 为针对 X 求出来的前K个主成分

如何将样本数据 X 从 n 维转换为 k 维?
想象一下,如果我们将 X 中的一个样本和 k个w 分别作点乘的话,那么我们的要的数据便是这个一个样本在k个方向上对应的每一个方向大小。正常情况下 k < n,说这样我们便完成了 n 维样本 到 k 维的映射。矩阵相乘表示为:
X⋅WkT=XmX\cdot W^{T}_{k} = X_{m}X⋅WkT​=Xm​
下面我们实现PCA算法的源码:

import numpy as npclass PCA:def __init__(self, n_components):"""初始化PCA"""assert n_components >= 1, "n_components must be valid"self.n_components = n_componentsself.components_ = Nonedef fit(self, X, eta=0.01, n_iters=1e4):"""获得数据集X的前n个主成分"""assert self.n_components <= X.shape[1], \"n_components must not be greater than the feature number of X"def demean(X):return X - np.mean(X, axis=0)def f(w, X):return np.sum((X.dot(w) ** 2)) / len(X)def df(w, X):return X.T.dot(X.dot(w)) * 2. / len(X)def direction(w):return w / np.linalg.norm(w)def first_component(X, initial_w, eta=0.01, n_iters=1e4, epsilon=1e-8):w = direction(initial_w)cur_iter = 0while cur_iter < n_iters:gradient = df(w, X)last_w = ww = w + eta * gradientw = direction(w)if (abs(f(w, X) - f(last_w, X)) < epsilon):breakcur_iter += 1return wX_pca = demean(X)self.components_ = np.empty(shape=(self.n_components, X.shape[1]))for i in range(self.n_components):initial_w = np.random.random(X_pca.shape[1])w = first_component(X_pca, initial_w, eta, n_iters)self.components_[i,:] = wX_pca = X_pca - X_pca.dot(w).reshape(-1, 1) * wreturn selfdef transform(self, X):"""将给定的X,映射到各个主成分分量中"""assert X.shape[1] == self.components_.shape[1]return X.dot(self.components_.T)def inverse_transform(self, X):"""将给定的X,反向映射回原来的特征空间"""assert X.shape[1] == self.components_.shape[0]return X.dot(self.components_)def __repr__(self):return "PCA(n_components=%d)" % self.n_components

紧接着我们自己通过测试来更感性的认识一下这个算法的强大:
小伙伴一定要记得把上述的Python代码(打包成PCA.py)和下面这个测试的放在一个目录下!!

import numpy as np
import matplotlib.pyplot as plt            #导入我们所需要的包X=np.empty((100,2))                        #随机创建一个我们需要的二维数组
X[:,0] = np.random.uniform(0.,100.,size=100)
X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0.,10.,size=100)from PCA import PCA
pca = PCA(n_components= 1)
pca.fit(X)
print(pca.components_)
'''此处得到的是我们所求的主成分的2个方向'''
X_reduction = pca.transform(X)
print(X_reduction.shape)
'''此时样本的2个特征已经降为一个特征,同样也可以将一维的恢复为原先的二维'''
X_restore = pca.inverse_transform(X_reduction)
print(X_restore.shape)
'''最后我们来可视化一下'''
plt.scatter(X[:,0],X[:,1],color = 'b',alpha = 0.5)
plt.scatter(X_restore[:,0],X_restore[:,1],color = 'r',alpha = 0.5)
plt.show()

可视化结果为:

大家可以很清晰的看到 紫色的离散点为原来二维数组中X的点 ,而红色的点映射成一条直线便是我们所求的降维后的主成分!!

机器学习之PCA原理入门相关推荐

  1. 机器学习之PCA原理

    PCA(principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  2. 机器学习算法-PCA降维技术

    机器学习算法-PCA降维 一.引言 在实际的数据分析问题中我们遇到的问题通常有较高维数的特征,在进行实际的数据分析的时候,我们并不会将所有的特征都用于算法的训练,而是挑选出我们认为可能对目标有影响的特 ...

  3. 机器学习从零到入门 集成学习

    集成学习 Bagging与Boosting 一.一个小故事 二.集成学习 - Ensemble Learning 1.弱学习器与强学习器 2.集成学习的具体步骤 3.集成方法 - Ensemble m ...

  4. 机器学习的工作原理是什么?

    机器学习是一种人工智能的分支,它使用算法和数学模型来分析数据并从中学习. 机器学习的工作原理是什么? 机器学习的工作原理可以概括为以下步骤: 数据收集:机器学习需要大量的数据来进行分析和学习.这些数据 ...

  5. 机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景

    目录 引言 二.线性回归 三.逻辑回归 四.支持向量机 五.决策树 六.随机森林 七.K-均值聚类 八.主成分分析(PCA) 九.K近邻算法 十.朴素贝叶斯分类器 十一.神经网络 十二.AdaBoos ...

  6. Spark工作原理入门

    Spark工作原理入门 文章目录 Spark工作原理入门 1.功能概要 基本描述 运用场景 实际使用 2.模块组成 HDFS MLlib Mesos Tachyon GraphX Spark SQL ...

  7. 《机器学习:算法原理与编程实践》的读书笔记:SMO部分最难,大部分代码基于Scikit-Learn,决策树其实用处不大

    机器学习:算法原理与编程实践 目录 [隐藏] 1 机器学习的基础 2 中文文本分类 3 决策树的发展 4 推荐系统原理 5 梯度寻优 6 神经网络初步 7 预测的技术与哲学 8 万能分类器:SVM 9 ...

  8. 机器学习 —— KNN算法简单入门

    机器学习 -- KNN算法简单入门 第1关:手动实现简单kNN算法 1 KNN算法简介 1.1 kNN 算法的算法流程 1.2 kNN 算法的优缺点 1.3 编程要求+参数解释 2. 代码实现 3. ...

  9. 机器学习与深度学习入门环境安装

    机器学习与深度学习入门环境安装 1.编程语言 2.开发平台 3.机器学习工具包 4.深度学习框架 1.编程语言 Python:"胶水语言",集成度高,简单实用,受众面广,开发者社区 ...

  10. 机器学习:(PCA)主成分分析法及应用(spss)

    目录 1.1.主成分分析法简介 1.2.主成分分析法的意义 1.3.主成分分析法的思想 1.4.主成分分析法的步骤 2.1.导入数据 2.2.生成图表 3.1.PCA算法梯度求解 3.1.1. 梯度上 ...

最新文章

  1. Openresty中使用LuaJit
  2. 关于mysql行级锁中MVCC的一些理解
  3. Windows10 UWP开发 - 响应式设计
  4. 带你全面了解比特黄金(bitcoin gold)分叉
  5. 如何使用 Docker 部署一个基于 Play Framework 的 Scala Web 应用?
  6. J2me流媒体技术实现讨论[2]
  7. Ubuntu/Debian交叉编译安装ARM平台版本的ffmpeg
  8. React AntD 表格查看修改时默认选中几行数据
  9. content add tpl.php,phpcms后台批量上传添加图片文章方法详解(一)
  10. 手机端html5 面试,今日头条 张祖俭 - H5动画在移动平台上的性能优化实践
  11. 爱奇艺取消剧集超前点播
  12. 锐捷(四)交换机虚拟化(VSU)+双主机检测(BFD)的配置
  13. 第一次只出现1次的字符
  14. 华为官方模拟器eNSP_B500高速网盘下载——带CE系统
  15. 注册Git时遇到问题 - Unable to verify your captcha response.
  16. 服务间歇性停顿问题优化|得物技术
  17. 2020曼彻斯特大学计算机2020,2020年曼彻斯特大学申请要求完整版
  18. 人工智能专业就业方向有哪些?
  19. 开发一个会叫自己“爷爷”的“孙子”,是一种什么样的体验?
  20. 百度地图添加多个marker点位标注

热门文章

  1. 基金投资入门1:基金基础知识介绍
  2. 【.Net Core】编译时禁止自动生成netcoreapp文件夹
  3. linux电脑外放没声音,ubuntu 16.04安装好后没声音的解决方法
  4. Javascrpt测试
  5. java工程名前有红色感叹号
  6. 车牌限行:受雾霾天气影响,某市决定当雾霾指数超过设定值时对车辆进行限行,假设车牌号全为数字,且长度不超过6位,限行规则如下:
  7. J2ME BUG 收集
  8. 计算机无法添加打印机,无法添加打印机,教您无法添加打印机怎么办
  9. Ps简单的墨笔画制作
  10. 广州物流展相关的个人总结