一、目标函数的梯度求解公式

  • PCA 降维的具体实现,转变为:

  

  • 方案:梯度上升法优化效用函数,找到其最大值时对应的主成分 w ;
  1. 效用函数中,向量 w 是变量;
  2. 在最终要求取降维后的数据集时,w 是参数;

 1)推导梯度求解公式

  • 变形一

    

  • 变形二

    

  • 变形三:向量化处理

    

  • 最终的梯度求解公式:▽f = 2 / m * XT . (X . dot(w) )

    

二、代码实现(以二维降一维为例)

  • 1)模拟数据

    import numpy as np
    import matplotlib.pyplot as pltX = 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)查看数据分布

    plt.scatter(X[:, 0], X[:, 1])
    plt.show()

  • 3)对原始数据集 demean 处理:得到新的数据集,数据集的每一种特征的均值都为 0

    def demean(X):return X - np.mean(X, axis=0)X_demean = demean(X)

  1. 数据集的每一个特征,都减去该列特征的均值,使得新的数据集的每一个特征的均值为 0;
  2. np.mean(X, axis=0):得到矩阵 X 每一列的均值,结果为一个列向量;
  • 4)使用梯度上升法求解主成分

  1. 求当前参数 w 对应的目标函数值(按推导公式求解)
    def f(w, X):return np.sum((X.dot(w)**2)) / len(X)

  2. 求当前参数 w 对应的梯度值(按推导公式求解)
    def df_math(w, X):return X.T.dot(X.dot(w))*2 / len(X)

  3. 求当前参数 w 对应的梯度值(按调试公式求解)
    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. 将向量 w 转化为单位向量
    def direction(w):return w / np.linalg.norm(w)

    # 因为推导公式时人为的将 w 向量的模设为 1,如果不将 w 向量转化为单位向量,梯度上升法的搜索过程会不顺畅;
    # np.linalg.norm(向量):求向量的模
    # 向量 / 向量的模 == 单位向量

  5. 梯度上升法的优化过程
    def gradient_ascent(df, X, initial_w, eta, n_iters=10**4, epsilon=10**-8):# 将初始化的向量 initial_w 转化为单位向量w = direction(initial_w)cur_iter = 0while cur_iter < n_iters:gradient = df(w, X)last_w = ww += eta * gradient# 注意1:将每一步优化后的向量 w 也转化为单位向量w = direction(w)if (abs(f(w, X) - f(last_w, X)) < epsilon):breakcur_iter += 1return w

    # 注意1:每一步优化后的向量 w 都要转化为单位向量

  • 5)求解数据的第一主成分

  1. 初始化
    initial_w = np.random.random(X.shape[1])
    eta = 0.001

    # 注意2:初始化 w 不能为 0 向量,因为在梯度公式中,若 w 为 0 ,无论什么数据,计算的结果都是没有任何方向的 0;

  2. 求解并绘制出第一主成分
    w = gradient_ascent(df_math, X_demean, initial_w, eta)plt.scatter(X_demean[:,0], X_demean[:,1])# 此处绘制直线,对应的两个点是(0, 0)、(w[0]*30, w[1]*30),构成了红色的直线
    # 由于 w[0]、w[1]数值太小,为了让直线看的更清晰,将该点扩大 30 倍
    # 这也是绘制向量的方法
    plt.plot([0, w[0]*30], [0, w[1]*30], color='r')
    plt.show()

    # 注意3:不能用 StandardScaler 标准化数据
    # 原因:由于PCA的过程本身就是求一个轴,使得所有的样本映射到轴上之后方差最大,但是,如果对数据标准化后,则样本的方差就变为 1 了,就不存在方差最大值了;
    # 其实 demean 的过程就是对数据标准化处理的一部分过程,只是没让数据的标准差为 1;
    # 在梯度下降法求解线性回归问题时需要对数据做归一化处理;

 6)求前 n 个主成分

  • 求下一个主成分的思路
  1. 思路:去掉当前数据集在上一个主成分方向上的分量,得到一个新的数据集,求新的数据集的主成分;
  2. 操作:将当前数据集的每一个样本,减去该样本在上一个主成分上的分量
  3. 步骤
    # 1)第一步:求新的数据集
    X2 = np.empty(X.shape)
    for i in range(len(X)):X2[i] = X[i] - X[i].dot(w) * w
    # for 循环向量化:X2 = X - X.dot(w).reshape(-1, 1) * w
    # X[i].dot(w):表示样本 X[i] 在上一主成分 w 方向上的膜
    # X[i].dot(w) * w:表示样本 X[i] 在上一主成分 w 上的分量(为向量)
    # X2[i] = X[i] - X[i].dot(w) * w:表示样本 X[i] 减去其在上一主成分上的分量后的新的样本向量# 2)第二步:初始化数据,求主成分
    initial_w = np.random.random(X.shape[1])
    eta = 0.01
    w2 = first_component(X2, initial_w, eta)

  • import numpy as np
    import matplotlib.pyplot as pltX = 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)# demean函数,将原始数据集 demean 处理
    def demean(X):return X - np.mean(X, axis=0)# 求当前变量 w 对应的目标函数值
    def f(w, X):return np.sum((X.dot(w)**2)) / len(X)# 求当前变量 w 对应的梯度的值
    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, n_iters=10**4, epsilon=10**-8):w = direction(initial_w)cur_iter = 0while cur_iter < n_iters:gradient = df(w, X)last_w = ww += eta * gradientw = direction(w)if (abs(f(w, X) - f(last_w, X)) < epsilon):breakcur_iter += 1return w# 求取 X 的前 n 个主成分
    # 求 X 的前 n 个主成分时,只需要对 X 做一次 demean 操作
    def first_n_components(n, X, eta=0.01, n_iters=10**4, epsilon=10**-8):X_pca = X.copy()X_pca = demean(X_pca)res = []# 循环 n 次,每次求出一个主成分,并将 n 个主成分放在列表 res 中返回for i in range(n):# 初始化搜索点:initial_winitial_w = np.random.random(X_pca.shape[1])# 求出主成分 ww = first_component(X_pca, initial_w, eta)res.append(w)# 获取下一次主成分的数据集:X_pca,用于计算下一个主成分X_pca = X_pca - X_pca.dot(w).reshape(-1,1) * wreturn res# 求数据集 X 的前 2 个主成分
    first_n_components(2, X)
    # 输出:[array([0.7993679 , 0.60084187]), array([-0.60084187,  0.7993679 ])]

转载于:https://www.cnblogs.com/volcao/p/9158892.html

机器学习:PCA(使用梯度上升法求解数据主成分 Ⅰ )相关推荐

  1. Python机器学习:PCA与梯度上升03求数据的主成分PCA

    梯度上升法解决最优化问题 import numpy as np import matplotlib.pyplot as plt X = np.empty((100,2)) X[:,0] = np.ra ...

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

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

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

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

  4. Python机器学习:PCA与梯度上升002使用梯度上升法求解PCA问题

    非监督学习,没有y的信息 还可以写成这样 向量化!

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

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

  6. python主成分对变量的贡献率_(数据科学学习手札20)主成分分析原理推导Python自编函数实现...

    主成分分析(principal component analysis,简称PCA)是一种经典且简单的机器学习算法,其主要目的是用较少的变量去解释原来资料中的大部分变异,期望能将现有的众多相关性很高的变 ...

  7. MAT之PCA:利用PCA(四个主成分的贡献率就才达100%)降维提高测试集辛烷值含量预测准确度并《测试集辛烷值含量预测结果对比》

    MAT之PCA:利用PCA(四个主成分的贡献率就才达100%)降维提高测试集辛烷值含量预测准确度并<测试集辛烷值含量预测结果对比> 目录 输出结果 实现代码 输出结果 后期更新-- 实现代 ...

  8. Python机器学习:PCA与梯度上升:05高维数据映射成低维数据(封装一个PCA)

    使用封装后的PCA进行操作 import numpy as np import matplotlib.pyplot as plt from pcaa.PCA import PCA 生成数据 X = n ...

  9. Python机器学习:PCA与梯度上升:04求数据的前n个主成分

    获取前N个主成分 #获取前n个主成分 import numpy as np import matplotlib.pyplot as plt 产生数据集 X = np.empty((100,2)) X[ ...

  10. 机器学习:用正规方程法求解线性回归

    求解线性回归最常用的两个方法是:梯度下降法和最小二乘法,之前在文章<机器学习:用梯度下降法实现线性回归>中介绍了梯度下降法的工作流程等,这篇文章着重介绍最小二乘法的使用.由于最小二乘法是基 ...

最新文章

  1. 在VmWare Workstation 6.5上安装Esx 3.5 U3之二
  2. 2019牛客暑期多校训练营(第七场)A String(暴力)
  3. 常见的NoSQL数据库
  4. K. Easy Sigma(类欧几里得)
  5. 剑指offer--旋转数组的最小数字
  6. Centos7.x Hadoop 3.x HDFS 写入文件
  7. 野火开发版屏幕_鸿蒙2.0手机开发者版发布,华为多数自研设备明年升级鸿蒙
  8. struct msghdr和struct cmsghdr【转载】
  9. 易考防作弊功能有哪些_浙江考试院发公告,上百名考生考研违规,你可以不努力但不能作弊...
  10. pynq z1+ov5640
  11. 基于EMC的共模干扰与差模干扰以及抑制方法(转载)
  12. UI设计中线面结合图标设计总结
  13. CC00388.CloudKubernetes——|KuberNetesCI/CD.V26|——|Jenkins.v06|自动构建Java应用.v06|报错处理|
  14. 是时候使用Markdown写作了
  15. 信息系统项目管理师2019年下半年上午试题解析(三)
  16. 抖音和tiktok是什么关系?TikTok和抖音差别大吗?
  17. 【小白破解电脑密码】忘记电脑开机密码了,怎么办?
  18. Github 首页美化教程 —— 美,是第一生产力
  19. 如何用python写汉诺塔游戏的辅助
  20. ASP.NET(C#)面试题

热门文章

  1. 小样本不符合正态_尿液样本HPV分型检测用于宫颈癌筛查的可能性
  2. Java 设计模式最佳实践:四、结构模式
  3. 包引入中,在包名前使用下划线“_”
  4. 基于Aspect的情感分析
  5. 第三章 基本粒子
  6. C# winform 魔兽MH全图制作教程(1): 开发准备工作
  7. 还在到处找Linux内核的学习资料吗?你想要的都在这里
  8. python秒杀神器苏宁_python实现自动登录 签到 京东 苏宁
  9. 水仙花数n位c语言程序,水仙花数C语言的
  10. 电脑桌面简约时钟工具OneClock