关于LPP与LE在降维上的区别在这篇文章上已经描述的十分清楚了:LE与LPP的简介(强烈建议看完这篇文章在看本文的代码解析)

假设已有数据集样本集合X={, ,..., },且每个样本的维度为m。

(一)求解LPP映射矩阵的算法步骤如下:

1.对整个数据集构建邻接矩阵W,即查找每个样本在数据集中距离最近的k个样本,如样本为样本k个最近邻接点之一,则在邻接矩阵W中的第i行j列元素以及第i列j行元素可通过以下公式计算得出:

                                  (1)

其中t为热核参数(设置多少自己看模型表现而定,一般可尝试1-10之间)若样本不为样本k邻接点之一,或样本不为样本k邻接点之一,则:

                                             (2)

2.求解下面问题的特征值以及特征向量

                                    (3)

其中的D是对角矩阵(diagonal matrix),其中的对角元素的值为第i行或者第i列的所有元素的值之和。其中的L为拉普拉斯矩阵,也是对称的半正定矩阵,

3.通过求解以上公式(3)中的特征问题,可以得到一系列的特征值以及该特征值对应的特征向量。然后我们根据这一系列的特征值进行升序排列,同时将对应的特征向量按列放入映射矩阵中。若我们需要将原始数据从m维降至d维,则我们需要取映射矩阵的前d列。映射公式如下:(映射矩阵为m*d的矩阵,样本为m×1的向量,为从降维得到的d*1的向量)

                                                           (4)

4.如果你没看文字开头链接的文章,你可能会有疑问,为什么求公式(3)的特征问题来得到映 射矩阵。

公式(3)是由LPP的最小化问题转化而来,该最小化问题如下:

XL已经确定的情况下,我们通过求解较小的特征值以及对应的特征向量来使该问题最小化。


以下是来自哈工大大佬的python代码块,github地址:https://github.com/heucoder/dimensionality_reduction_alo_codes/tree/master/codes

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets import load_digits, load_irisdef rbf(dist, t = 1.0):'''rbf kernel function'''return np.exp(-(dist/t))def cal_pairwise_dist(x):'''计算pairwise 距离, x是matrix(a-b)^2 = a^2 + b^2 - 2*a*b'''sum_x = np.sum(np.square(x), 1)dist = np.add(np.add(-2 * np.dot(x, x.T), sum_x).T, sum_x)#返回任意两个点之间距离的平方return distdef cal_rbf_dist(data, n_neighbors = 10, t = 1):dist = cal_pairwise_dist(data)n = dist.shape[0]rbf_dist = rbf(dist, t)W = np.zeros((n, n))for i in range(n):index_ = np.argsort(dist[i])[1:1 + n_neighbors]W[i, index_] = rbf_dist[i, index_]W[index_, i] = rbf_dist[index_, i]return Wdef lpp(data,n_dims = 2,n_neighbors = 30, t = 1.0):''':param data: (n_samples, n_features):param n_dims: target dim:param n_neighbors: k nearest neighbors:param t: a param for rbf:return:'''N = data.shape[0]W = cal_rbf_dist(data, n_neighbors, t)  #建立邻接矩阵W,参数有最近k个邻接点,以及热核参数tD = np.zeros_like(W)for i in range(N):D[i,i] = np.sum(W[i]) #求和每一行的元素的值,作为对角矩阵D的对角元素L = D - W  #L矩阵XDXT = np.dot(np.dot(data.T, D), data)XLXT = np.dot(np.dot(data.T, L), data)'''np.linalg.eig用作计算方阵的特征值以及右特征向量np.linalg.pinv对矩阵进行求逆本人理解:在求解最小特征问题(公式3)时,左乘XDX^T的逆,而后求其特征值以及对应特征向量输出的eig_val,eig_vec为特征值集合以及特征向量集合(此时是无序的)'''eig_val, eig_vec = np.linalg.eig(np.dot(np.linalg.pinv(XDXT), XLXT))'''argsort返回的是特征值在数据eig_val排序后的序号。如数组a=[2,1,7,4],则np.argsort(a)返回的是[1,0,3,2]'''sort_index_ = np.argsort(np.abs(eig_val))eig_val = eig_val[sort_index_]#对特征值进行排序print("eig_val[:10]", eig_val[:10])#此时eig_val已经是升序排列了,需要排除前几个特征值接近0的数,至于为啥请看论文 "Locality Preserving Projections"j = 0while eig_val[j] < 1e-6: j+=1print("j: ", j)#返回需要提取的前n个特征值所对应的n个特征向量的序列号sort_index_ = sort_index_[j:j+n_dims]# print(sort_index_)eig_val_picked = eig_val[j:j+n_dims]print(eig_val_picked)eig_vec_picked = eig_vec[:, sort_index_] #获取该n个特征向量组成的映射矩阵data_ndim = np.dot(data, eig_vec_picked) #公式(4)return data_ndimif __name__ == '__main__':X = load_digits().datay = load_digits().targetdist = cal_pairwise_dist(X)max_dist = np.max(dist)print("max_dist", max_dist)data_2d = lpp(X, n_neighbors = 5, t = 0.01*max_dist)plt.figure(figsize=(12,6))plt.subplot(121)plt.title("LPP")plt.scatter(data_2d[:, 0], data_2d[:, 1], c = y)

(二)接下来是求解LE降维的步骤:

1.第一步构造邻接矩阵W,构造的思路与LPP一致,每个样本均与最近的k个邻接点建立权重关系:

                               (5)

2.求解下面问题的特征值以及特征向量

                                                            (6)

其中,降维后的矩阵的列向量将会来自公式(6)求出的特征矩阵

3.通过求解公式(6),我们将得到的特征值按升序排列,并把特征向量按照对应特征值的大小依次作为列向量放入特征矩阵Y中。若我们需要将数据从m维降至d维,则只需要取特征矩阵的前d列。形成的n*d的矩阵即为降维后的矩阵,其中每一行数据为样本降维表示。

4.公式(6)由LE的最小化问题转化而来,该最小化问题表示如下:

                                                    (7)

LD是确定的情况下,我们通过求解公式(6)较小的特征值以及对应的特征向量来是问题(7)最小化。


import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from mpl_toolkits.mplot3d import Axes3Ddef rbf(dist, t = 1.0):'''rbf kernel function'''return np.exp(-(dist/t))def cal_pairwise_dist(x):'''计算pairwise 距离, x是matrix(a-b)^2 = a^2 + b^2 - 2*a*b'''sum_x = np.sum(np.square(x), 1)dist = np.add(np.add(-2 * np.dot(x, x.T), sum_x).T, sum_x)#返回任意两个点之间距离的平方return distdef cal_rbf_dist(data, n_neighbors = 10, t = 1):dist = cal_pairwise_dist(data)n = dist.shape[0]rbf_dist = rbf(dist, t)W = np.zeros((n, n))for i in range(n):index_ = np.argsort(dist[i])[1:1+n_neighbors]W[i, index_] = rbf_dist[i, index_]W[index_, i] = rbf_dist[index_, i]return Wdef le(data,n_dims = 2,n_neighbors = 5, t = 1.0):''':param data: (n_samples, n_features):param n_dims: 目标维度:param n_neighbors: k个最近邻接点:param t: 热核参数t:return:'''N = data.shape[0]W = cal_rbf_dist(data, n_neighbors, t) #求邻接矩阵WD = np.zeros_like(W)for i in range(N):D[i,i] = np.sum(W[i])#建立对角矩阵D,对角元素均为邻接矩阵第i行或者第i列元素值之和'''本人理解:在求解最小特征问题(公式6)时,左乘矩阵D的逆,而后求其特征值以及对应特征向量输出的eig_val,eig_vec为特征值集合以及特征向量集合(此时是无序的)'''D_inv = np.linalg.inv(D) L = D - Weig_val, eig_vec = np.linalg.eig(np.dot(D_inv, L))sort_index_ = np.argsort(eig_val)eig_val = eig_val[sort_index_]print("eig_val[:10]: ", eig_val[:10])j = 0while eig_val[j] < 1e-6: #排除特征值接近于0,以及该特征值对应的特征向量j+=1print("j: ", j)sort_index_ = sort_index_[j:j+n_dims] #提取特征值大于1e-6开始的序号eig_val_picked = eig_val[j:j+n_dims]  print(eig_val_picked)eig_vec_picked = eig_vec[:, sort_index_]#根据序号从特征向量集合中得到映射后的降维矩阵# print("L: ")# print(np.dot(np.dot(eig_vec_picked.T, L), eig_vec_picked))# print("D: ")# D not equal I ???print(np.dot(np.dot(eig_vec_picked.T, D), eig_vec_picked))#LE不同于LPP,LE不存在Si=YXi的映射关系,特征矩阵中[j:j+n_dim]的列向量便是原始数据的降维表示。X_ndim = eig_vec_pickedreturn X_ndimif __name__ == '__main__':X = load_digits().datay = load_digits().targetdist = cal_pairwise_dist(X)max_dist = np.max(dist)print("max_dist", max_dist)X_ndim = le(X, n_neighbors = 20, t = max_dist*0.1)plt.scatter(X_ndim[:, 0], X_ndim[:, 1], c = y)plt.show()

LPP(局部保持投影)以及LE(拉普拉斯映射)的区别以及代码python解读相关推荐

  1. 机器学习基础---降维方法---局部保持投影(LPP)推导

    LPP 方法概述 核心思想 有映射Ym∗n=f(Xd∗n)\underset{m*n}{Y}=f(\underset {d*n}X)m∗nY​=f(d∗nX​),能够实现将d维的样本变换到m维空间之中 ...

  2. 【机器学习】【降维】局部保持投影(LPP Locality Preserving Projections)

    文章目录 局部保持投影(LPP) 一.摘要: 二.主要思想 三.算法步骤 四.算法详解 局部保持投影(LPP) 论文:<Locality Preserving Projections>作者 ...

  3. 局部保留投影算法(LPP)(Locality Preserving Projections)详解

    1.问题导入 2.算法出处 3.算法详解 4.算法步骤 算法全称<Locality preserving projections>出自何小飞教授论文X.He,P.Niyogi,Locali ...

  4. 局部保留投影(LPP)推导

    流形算法的主要思想是能够学习高维空间中样本的局部邻域结构,并寻找一种子空间能够保留这种流行结构, 使得样本在投影到低维空间后,得到比较好的局部近邻关系. 所谓流形,是指高维样本空间中呈现的一种低维的局 ...

  5. 【流行学习】局部保持投影(Locality Preserving Projections)

    一.前言 局部保持投影算法(LPP)主要是通过线性近似LE(Laplacian Eigenmaps),想保留的是高维中的局部信息 二.主要步骤 具体步骤如下所示: 1.确定LPP的目标函数:min⁡1 ...

  6. 【流行学习】拉普拉斯映射(Laplacian Eigenmaps)

    一.前言 拉普拉斯特征映射是一种基于图的降维算法,它希望在原空间中相互间有相似关系的点,在降维后的空间中尽可能的靠近,从而在降维后仍能保持原有的数据结构信息. 二.主要步骤 拉普拉斯特征映射通过构建邻 ...

  7. 全局敏感度,局部敏感度和平滑敏感度到底有什么区别?【差分隐私】

    全局敏感度,局部敏感度和平滑敏感度到底有什么区别?[差分隐私] 写在前面的话 噪声校准 全局敏感度: 局部敏感度 平滑敏感度 噪声分布范围 自己的理解 写在前面的话 关于敏感度相关的知识,我认为这是差 ...

  8. java8 map_Java8 Map 示例:一个略复杂的数据映射聚合例子及代码重构

    原标题:Java8 Map 示例:一个略复杂的数据映射聚合例子及代码重构 来源:琴水玉, www.cnblogs.com/lovesqcc/p/7812875.html 本文内容来自真实的工作案例,因 ...

  9. 源NAT,目的NAT和PAT以及端口映射的区别?

    源NAT,目的NAT和PAT以及端口映射的区别? 参考链接: 1.https://blog.51cto.com/hzcto/2418606 2.[转载]网络地址转换(NAT)和端口映射 https:/ ...

最新文章

  1. vuerouter3种模式_Vue-router的三种传参方式
  2. 总监调岗至前台,企业被判赔偿26万,法院:“侮辱性调岗”违法
  3. [NOIP2012] 借教室
  4. leetcode C++ 13. 罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
  5. 名词解释计算机网络体系结构,计算机网络技术题库(带答案).doc
  6. 组播相对于单播和广播的优势
  7. Python(51)_从100打印到0
  8. mysql 5.0 慢日志_MySQL的慢查询日志
  9. “互联网+监管”平台建设思路
  10. 基于FPGA的RS485通信接口实验手册
  11. 面试如何解释上份工作时间短
  12. 小米手环5表盘bin文件解包修改
  13. 电脑开的热定手机连不上解决方法
  14. Doris0.13.15升级至0.14.12.4故障[Bug] NPE when replaying CheckConsistencyJob
  15. QQ查询信息php,查询QQ信息
  16. 微信特殊字符包括颜文字、表情的后台存储及前端展示方法
  17. 关于安全领域方向上学习的一点个人见解
  18. 《MongoDB》 数组操作
  19. 如何构建业务数据分析体系
  20. Android Studio更换眼睛保护背景色

热门文章

  1. 集成饿了么、美团、百度等外卖系统功能
  2. 教你使用MATLAB绘制超超超炫丽的烟花!
  3. 项目经理如何有效管理项目预算?
  4. 给seo外链员的一些忠告
  5. 《高敏感是种天赋》:HSP自救指南
  6. 帝国插件-最全帝国插件中心免费下载
  7. 什么是信用证L/C?
  8. python能做的100件事-01-python处理office文档
  9. Linux 性能优化实战(倪朋飞)---系统中出现大量不可中断进程和僵尸进程怎么办?
  10. mysql 临时表 主键_MySQL中临时表的基本创建与使用教程(CREATETEMPORARY TABLE)