一. 原理

经过上一节,我们有如下结论。

1. 目标:求w,使得f(X)最大。其中:

2. 梯度可表示为:

即:

对其进行向量化处理:

也可写成:

故将梯度向量化结果为:

二. 实现

1. 生成数据集

(1)导入需要的模块和包

import numpy as np
import matplotlib.pyplot as plt

(2)生成虚拟的测试用例。生成的X有两个特征,特征1为1~100之间随机分布的100个样本,特征2和相应的特征1有基本的线性关系0.75 * 特征1 + 3 + 噪音。(线性关系时降维效果比较明显)

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)

查看图像:

2. demean过程

(1)demean函数:

def demean(X):# np.mean(X, axis=0):对X矩阵在行方向上求得均值,最终结果为每一列的均值。# 若X为m * n,则操作后得到1 * n的向量return X - np.mean(X, axis=0)

(2)测试一下函数:

# 对X矩阵数据均值归零操作
X_demean = demean(X)

查看图像,发现具体绘制数据情况和原先X大多一致。观察坐标轴,中心位置大概为(0, 0)。

验证:查看X和demean后的X在两个维度上的平均值,发现demean后的平均值都接近于0。

np.mean(X_demean[:, 0]), np.mean(X_demean[:, 1])

3. 使用梯度上升法求解数据的主成分

① 相关函数的实现:

(1)根据目标函数:

计算目标函数的方法f(w, X):

# X为归零化的矩阵
def f(w, X):return np.sum((X.dot(w) ** 2)) / len(X)

(2)根据目标函数对应梯度的计算公式:

计算目标函数对应的梯度的方法df_math(w, X):

def df_math(w, X):return X.T.dot(X.dot(w)) * 2. / len(X)

(3)验证梯度计算是否正确的函数df_debug(w, X, epsilon):

def df_debug(w, X, epsilon=0.0001):res = np.empty(len(w))for i in range(len(w)):w_1 = w.copy()w_1[i] += epsilonw_2 = w.copy()w_2[i] -= epsilonres[i] = (f(w_1, X) - f(w_2, X)) / (2 * epsilon)return res

(4)单位向量化函数direction(w)(公式为:向量 / 模长):

# 计算单位向量:w / |w|
def direction(w):return w / np.linalg.norm(w)

(5)梯度上升函数 gradient_ascent(注意先将w变成单位向量):

# 梯度上升法过程,代码结构与梯度下降法完全一样
# 注意:w为单位向量
def gradient_ascent(df, X, inital_w, eta, n_iters = 1e4, epsilon=1e-8):w = direction(inital_w)cur_iter = 0while cur_iter < n_iters:gradient = df(w, X)last_w = ww = w + eta * gradient# 注意:每次求单位向量w = direction(w) if (abs(f(w, X) - f(last_w, X)) < epsilon):breakcur_iter += 1return w

注意:对于PCA问题对样本数据标准化归一化过程不能使用StandardScaler!!!

为什么?由于PCA过程本身就是要求一个轴使得所有的样本映射到那轴之后样本的方差最大,但是一旦我们将我们样本数据进行标准化,样本的方差就变成1,方差的最大值就不存在了。这样一来就求不出PCA真正想最大化的结果了。

实际上demean过程已经做了一半,将均值变为0了,少做的一半就是不让我们数据的标准差为1。

② 调用梯度上升法:

(1)初始化w值:不能为零向量。

# 调用梯度上升法
# 初始化w值。注意:不能为零向量,否则带入都为0
init_w = np.random.random(X.shape[1])  # 个数为样本特征数
init_w
# array([0.51062981, 0.24947237])

(2)分别使用测试和计算的方法,得出的w向量相同。

eta = 0.001
# 梯度上升法求得的原来的数据将它映射到此轴上方差最大# 使用测试的方法
gradient_ascent(df_debug, X_demean, init_w, eta)
# array([0.76696199, 0.64169254])# 使用计算的方法
w = gradient_ascent(df_math, X_demean, init_w, eta)
w
# array([0.76696199, 0.64169254])

(3)绘制出图像对w进行观察:

plt.scatter(X_demean[:, 0], X_demean[:, 1])
# 乘以30是以便观察, 因为方向向量非常小
plt.plot([0, w[0] * 30], [0, w[1] * 30], color='r')
plt.show()

绘制出的红线即为样本要映射到的方向向量,使得样本间方差最大。相应的轴即为一个主成分,又称为第一主成分

机器学习 -- PCA(Ⅱ 梯度上升法解决主成分分析问题)相关推荐

  1. EL之Boosting之GB(DTR):利用梯度提升法解决回归(对多变量的数据集+实数值评分预测)问题

    EL之Boosting之GB(DTR):利用梯度提升法解决回归(对多变量的数据集+实数值评分预测)问题 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 xList = [] labe ...

  2. 第7章 PCA与梯度上升法

    主成分分析法:主要作用是降维 疑似右侧比较好? 第三种降维方式: 问题:????? 方差:描述样本整体分布的疏密的指标,方差越大,样本之间越稀疏:越小,越密集 第一步: 总结: 问题:????怎样使其 ...

  3. 07 PCA(主成分分析)之梯度上升法

    上篇讲的是PCA基于矩阵操作方法的实现,本文讲的是基于梯度上升法实现的PCA. PCA之梯度上升法 PCA原理 主成分分析PCA 均值归零(demean) 映射轴和方差 梯度上升法 代码实现 单个主成 ...

  4. 机器学习基础篇(十一)——主成分分析法

    机器学习基础篇(十一)--主成分分析法 一.简介 当我们对含有多个变量的数据进行观测时,我们会收集大量的数据然后分析他们.大样本的数据集固然提供了丰富的信息,但是在一定程度上增加了问题的复杂性. 如果 ...

  5. 使用梯度上升法求解 PCA 问题

    代码实现: import numpy as np import matplotlib.pyplot as pltX = np.empty((100,2)) X[:,0] = np.random.uni ...

  6. 机器学习框架_一个框架解决几乎所有机器学习问题

    一个叫 Abhishek Thakur 的数据科学家,在他的 Linkedin 发表了一篇文章 Approaching (Almost) Any Machine Learning Problem,介绍 ...

  7. 主成分分析(PCA)原理详解 2016/12/17 · IT技术 · 主成分分析, 数学 分享到: 21 原文出处: 中科春哥 一、PCA简介 1. 相关背景 主成分分析(Principa

    主成分分析(PCA)原理详解 2016/12/17 · IT技术 · 主成分分析, 数学 分享到:21 原文出处: 中科春哥    一.PCA简介 1. 相关背景 主成分分析(Principal Co ...

  8. 机器学习 の04 梯度提升决策树GBDT

    机器学习 の04 梯度提升决策树GBDT GBDT的背景知识 集成学习(ensemble learning) Bagging(Bootstrap Aggregating)算法 Boosting提升算法 ...

  9. 机器学习模型调优方法(过拟合、欠拟合、泛化误差、集成学习)

    机器学习模型调优方法 过拟合和欠拟合 降低过拟合风险的方法 降低欠拟合风险的方法 泛化误差.偏差和方差 泛化误差 偏差和误差 模型评估 Holdout检验 交叉检验 自助法 集成学习 Boosting ...

  10. 一文清晰讲解机器学习中梯度下降算法(包括其变式算法)

    本篇文章向大家介绍梯度下降(Gradient Descent)这一特殊的优化技术,我们在机器学习中会频繁用到. 前言 无论是要解决现实生活中的难题,还是要创建一款新的软件产品,我们最终的目标都是使其达 ...

最新文章

  1. html自动补全pspad,免费代码编辑器 PSPad Editor 5.0.4.541 中文多语免费版
  2. Caused by: java.sql.SQLException: GC overhead limit exceeded处理百万数据出现的异常
  3. Android 的 init.rc 文件简介【转】
  4. springboot 获取登录浏览器_java项目部署到linux服务器,微信小程序后台springboot项目部署到云服务器(图文详解)...
  5. asp.net mvc4 设置build项目时,编译view页面
  6. ProxyToken:微软 Exchange 服务器中的认证绕过新漏洞,可窃取用户邮件
  7. mysql root用户可以同时几个人连接_重学MySQL系列(四):10分钟快速掌握MySQL用户与权限管理
  8. 手机qq下载文件地址
  9. SketchUp插件|FredoGhost幻影替身插件最新版免费下载及介绍(轻量化草图大师模型)
  10. 一点浩然气,千里快哉风(修炼孟子浩然之气)
  11. python pgm 转 bmp
  12. 雅思口语考官常问的100个话题整理-自己整理
  13. Photoshop Elements 10 All-in-One For Dummies 免积分下载
  14. 利用gpu加速神经网络算法,外接gpu 训练神经网络
  15. 【React】项目中组件化使用svg格式的图片
  16. python 透明图片合成_python:图片合成(PIL 库Image类模块)
  17. Intel无线网卡蓝牙功能失效解决思路分享
  18. 邻接矩阵的定义和例子
  19. LinkedIn领英三方插件使用教程
  20. cocoapods——更新

热门文章

  1. 签署您的应用——多渠道签名打包教程
  2. 我的世纪佳缘线下的被骗经历。
  3. 游戏《我的世界》马怎么繁殖?如何驯化?
  4. Wed Sep 16 2020 00:00:00 GMT+0800 (中国标准时间)时间转换为mysql date类型
  5. 企业网络安全的重要性
  6. Java 读取Word中的脚注、尾注
  7. [免费配音软件]语音合成,让阿里云小姐姐为你的视频配音
  8. c语言abs作用是什么意思,c语言fabs()是什么意思?和abs()有什么区别
  9. String类实例化
  10. pdf文件如何转换成word?