目录

  • 主要内容
    • 关于缺失数据的导数
  • 附录
    • 极大似然估计
  • 代码

Sanguinetti G, Lawrence N D. Missing data in kernel PCA[J]. european conference on machine learning, 2006: 751-758.

普通的kernel PCA是通过\(K\),其中\(K_{ij} = \Phi^T(y_i) \Phi(y_j)\)来获得,很显然,如果数据有缺失,就不能直接进行kernel PCA了,这篇文章所研究的问题就是,在数据有缺失的情况下,该怎么进行kernel PCA。

这篇文章的亮点,在我看来,是将kernel PCA和数据缺失结合起来。把kernel 去掉,已经有现存的文章了,至少那篇PPCA就是一个例子吧。kernel的作用就是,非显示地将样本映射到高维空间,所以,就得想办法把这玩意儿给造出来。

假设样本已经中心化。

主要内容

在PPCA中,每个样本服从:
\[ y_i = W x_i + \epsilon \]
其中\(y_i \in \mathbb{R}^d\)为样本,\(x_i \in \mathbb{R}^q\)为隐变量,\(W \in \mathbb{R}^{d \times q}, d > q\),\(\epsilon \sim N(0, \sigma^2 I)\)。

PPCA中,假设\(x_i\)服从一个正态分布,而作者是通过一个对偶,将\(W\)设置为随机向量,每个\(w_{ij} \sim N(0,1)\)(说实话,我对啥是对偶越来越晕了),通过将\(W\)积分掉,可得:
\[ y^{(j)} \sim N(0, XX^T + \sigma^2I) \]
其中,\(y^{(j)}\)是\(Y\)的第j列,\(Y\)的第i行是\(y_i\),\(X\)的第i行是\(x_i\)。这个的证明和在贝叶斯优化中推导的证明是类似的,这里就不多赘述了。

其似然函数关于\(X\)求极大可以得到:
\[ X = U \Lambda R \]
其中\(U\)是\(K=\frac{1}{d}YY^T\)的特征向量,而
\[ \Lambda = (V - \sigma^2 I)^{\frac{1}{2}} \]
其中\(V\)是\(U\)所对应的特征值,而\(R\)是任意的正交矩阵。
虽然论文里没讲,但是\(\sigma^2\)d的估计应该是下面的这个吧:
\[ \sigma^2 = \frac{1}{N-q}\sum_{i=q+1}^N \lambda_i \]

这部分的推导见附录。

上面的过程可以这么理解,我们用\(XX^T + \sigma^2 I\)来近似\(K\),因为实际上,似然函数有下面的形态(舍掉了一些常数):

上面这个式子不仅是对数似然函数,也是交叉熵,交叉熵又和K-L散度(描述俩个分布之间距离的)有关,所以我们极大化似然函数的过程,实际上就是在找一个\(K\)的近似\(C\)。

直到现在,我们依然没有将kernel结合进去,注意到:
\[ K = \frac{1}{d}YY^T \]
\(K_{ij} = \frac{1}{d}y_i^T y_j\),所以,对于任意的\(\Phi(\cdot)\)作用于\(y_i\),
\[ K_{ij} = \frac{1}{d}\Phi^T(y_i)\Phi(y_j) \]
kernel PCA呼之预出,我们逼近\(K\)实际上就是去近似kernel PCA。

这里有一个假设,就是\(y_i\)是已知的,如果\(y_i\)是缺失的,那么我们没有办法找到\(C\),现在的问题也就是有缺失数据的时候,如何进行kernel PCA。


根据上面的分析,很自然的一个想法就是,先通过插补补全数据,计算\(K\),然后再计算\(C\),这个时候,似然函数里面,将缺失数据视作变量,再关于其最小化交叉熵,反复迭代,直至收敛,便完成了缺失数据下的kernel PCA。我有点搞不懂为什么是最小化交叉熵了,如果我没理解错,这里的交叉熵是指-L吧。俩个分布的交叉熵如下:
\[ -\int p(x) \ln q(x) \mathrm{d}x \]
所以\(N(0,K),N(0,C)\)的交叉熵应该是-L。而且,我做了实验,至少只有极大化似然函数,结果才算让人满意。所以文章中的交叉熵应该是-L,所以我们要做的就是最小化交叉熵,最大化似然函数。

关于缺失数据的导数

假设\(C\)是已知的,\(Y_{ij}\)是缺失的,那么我们希望关于\(Y_{ij}\)最大化下式(擅作主张了):

记\(C^{-1}\)的第\(i\)列(行)为\(c\)(因为是对称的),假设kernel选择的是\(k(x,y)=\exp \{-\frac{\gamma}{2}(||x-y||_2^2)\}\)
\[ \mathrm{d}K_{ik} = -\frac{\gamma}{d} \exp \{-\frac{\gamma}{2}\|Y_i-Y_k\|^2\}(Y_{ij}-Y_{kj}), \quad k \ne i \]
\[ \begin{array}{ll} \mathrm{d}L &= -\frac{1}{2}\mathrm{Tr}(\mathrm{d}KC^{-1})\\ &= [\gamma \sum \limits_{k=1}^N K_{ik} (Y_{ij}-Y_{kj})c_k] \mathrm{d}Y_{ij} \\ &= [\gamma Y_{ij} K_i^T c - \gamma K_i^T diag(c)Y^{(j)}] \mathrm{d}Y_{ij} \end{array} \]
令其为0,可得:
\[ K_i^TcY_{ij} = K_i^T diag(c)Y^{(j)} \]
这个方程咋子解咯,而且是如果有不止一个缺失值不就凉凉了。
文章说用共轭梯度法,所以说没显示解?

附录

极大似然估计

容易知道,其对数似然函数为:
\[ L = -\frac{Nd}{2} \ln 2\pi - \frac{d}{2} \ln |C| - \frac{d\mathrm{Tr}(C^{-1}K)}{2} \]
其中\(C = XX^T+\sigma^2 I\),容易获得:
\[ \mathrm{d}L = -d\mathrm{Tr}(C^{-1}X \mathrm{d}X^T) + d \mathrm{Tr}(C^{-1}KC^{-1}XdX^T) \]
所以,在满足下式的点中取得极值:
\[ C^{-1}X = C^{-1}KC^{-1}X \\ \Rightarrow \quad KC^{-1}X = X \]

  1. \(X = 0\), 没有什么意义;
  2. \[ X = U\Lambda R \]
    此时\(KC^{-1}X=X\),注意当\(K\)可逆的时候,此时\(KC^{-1}=I\),但是当\(K\)不可逆的时候,需要用\(K = \sum_{i=1}^l \lambda_i(K)u_i(K)u_i^T(K)\)来考虑(不过凉凉的是,\(\lambda_i \ge \sigma^2\)好像就可能失效了)。

  3. 就是PPCA里面讲过的,令\(X=U'L'V'^T\)
    \[ KU'=U'(\sigma^2 L+L^2) \]
    即\(U'\)为\(K\)的特征向量,结果是类似的。

到这里,我们也只讲了什么点是能取得极值的候选点,为什么取得极值,还是没弄懂。

代码

在做实验的时候,对初始点,也就是缺失值的补全要求还是蛮高的,差20%就GG了,而且开始几步收敛很快,后面收敛超级慢,所以我不知道怎么设置收敛条件了。

import numpy as npclass MissingData:def __init__(self, data, index, q):""":param data:缺失数据集,缺失部分通过平均值补全:param index: ij==1表示缺失:param q: 隐变量的维度"""self.__data = np.array(data, dtype=float)self.__index = indexself.__n, self.__d = data.shapeself.gamma = 1 #kernel的参数assert self.__d > q, "Invalid q"self.q = q@propertydef data(self):return self.__data@propertydef index(self):return self.__index@propertydef n(self):return self.__n@propertydef d(self):return self.__ddef kernel(self, x, y, gamma):"""kernel exp"""return np.exp(-gamma / 2 *(x-y) @ (x-y))def compute_K(self):K = np.zeros((self.n, self.n))for i in range(self.n):x = self.data[i]for j in range(i, self.n):y = self.data[j]K[i, j] = K[j, i] = self.kernel(x, y, self.gamma)self.K = K / self.ddef ordereig(self, A):"""晕了,没想到linalg.eig出来的特征值不一定是按序的"""value, vector = np.linalg.eig(A)order = np.argsort(value)[::-1]value = value[order]vector = vector.T[order].Treturn value, vectordef compute_C(self):value, vector = self.ordereig(self.K)value1 = value[:self.q]value1 = value1[value1 > 0]value2 = value[self.q:]U = vector[:, :len(value1)]sigma2 = np.mean(value2)self.X = U * np.sqrt(value1 - sigma2)self.C = self.X @ self.X.T + sigma2 * np.identity(self.n)self.invC = np.linalg.inv(self.C)def compute_unit(self, i, j):c = self.invC[i]return -self.gamma * (self.data[i, j] * self.K[i] @ c -(self.K[i] * c) @ self.data[:, j])def compute_grad(self):"""计算导数,但愿我的公式没推错"""delta = np.zeros((self.n, self.d), dtype=float)for i in range(self.n):for j in range(self.d):if self.index[i, j] == 1:delta[i, j] = self.compute_unit(i, j)self.delta = deltadef likehood(self, K):return 1 / 2 * np.trace(K @ self.invC)def temp_K(self, data):K = np.zeros((self.n, self.n), dtype=float)for i in range(self.n):x = data[i]for j in range(i, self.n):y = data[j]K[i, j] = K[j, i] = self.kernel(x, y, self.gamma)return K / self.ddef backtrack(self, alpha=0.4, beta=0.7):"""采用回溯梯度下降:param alpha::param beta::return:"""count = 0time = 0self.compute_K()self.compute_C()self.compute_grad()norm = -np.sum(self.delta ** 2)t = 1L1 = self.likehood(self.K)while True:time += 1while True:count += 1data = self.data - self.delta * ttempK = self.temp_K(data)L2 = self.likehood(tempK)if L2 > L1 + alpha * t * norm:t = beta * telse:self.__data = np.array(data, dtype=float)breakdelta = np.array(self.delta)self.compute_K()self.compute_grad()print(time, count, L1, L2)if np.sum((delta - self.delta) ** 2) < 1e-6:breaknorm = -np.sum(self.delta ** 2)t = 1L1 = self.likehood(self.K)count = 0def processing(self, alpha=0.4, beta=0.7):count = 0while count < 7: #我不知道怎么判断收敛就这么玩一玩吧count += 1print("**********{0}**********".format(count))self.backtrack(alpha, beta)

转载于:https://www.cnblogs.com/MTandHJ/p/10800777.html

Missing Data in Kernel PCA相关推荐

  1. 从PCA到Kernel PCA(Python)

    PCA不进行分类的动作,而只做做数据预处理,将样本变换到一个容易分类(向最大化方差的方向,principal component axes,投影)的更低维的新的特征空间中.Kernel PCA比PCA ...

  2. R语言ggplot2可视化:使用堆叠的条形图(Stacked Barplot)可视化每个数据行(row)的缺失值的情况(Visualizing missing data counts in rows)

    R语言ggplot2可视化:使用堆叠的条形图(Stacked Barplot)可视化每个数据行(row)的缺失值的情况(Visualizing missing data counts in rows) ...

  3. 论文解读:Missing data imputation with adversarially-trained graph convolutional network

    标题: Missing data imputation with adversarially-trained graph convolutional networks 用对抗训练图卷积网络实现缺失数据 ...

  4. GAIN: Missing Data Imputation using Generative Adversarial Nets(基于生成对抗网络的缺失数据填补)论文详解

    目录 一.背景分析 1.1 缺失数据 1.2 填补算法 二.GAIN 2.1 GAIN网络架构 2.2 符号描述(Symbol Description) 2.3 生成器模型 2.4 判别器模型 2.5 ...

  5. 使用python进行缺失数据估算(missing data imputation in python)

    Missing data imputation with Impyute 在缺失值填充中,python中有一些开源的方法. 这些方法主要是包括: 删除法(most searched in google ...

  6. 【Motif Discovery with Missing Data】

    Motif Discovery with Missing Data 一.文献相关信息 二 .重要定义 三.伪缺失数据(PMD) 四.论文拟解决的主要问题 五.论文的主要研究内容 六.创建下界Dista ...

  7. GAIN: Missing Data Imputation using Generative Adversarial Nets学习笔记

    GAIN: Missing Data Imputation using Generative Adversarial Nets(基于对抗生成网络实现缺失数据插补) 缺失数据插补算法问题背景 缺失数据 ...

  8. 核PCA(Kernel PCA)学习笔记

    感谢大佬们的文章 1.(46条消息) Gram矩阵_wangyang20170901的博客-CSDN博客_gram矩阵 2.数据降维: 核主成分分析(Kernel PCA)原理解析 - 知乎 ---- ...

  9. More than 100 items having missing data for more than 10 minutes

    zabbix告警 More than 100 items having missing data for more than 10 minutes 查看zabbix-Administration-Qu ...

最新文章

  1. 当代的设计潮流是什么_解码“潮流合伙人”IP生意经
  2. Gil Zilberfeld问答:敏捷产品的规划与管理
  3. get assigned pageset and my pages
  4. 加工中心宏程序生成器_宏程序G1铣锥度螺纹NPT
  5. 【深度一键还原】我的台式机
  6. 微软独特的数字化转型思想和方法论
  7. 小游戏公司该如何应对网络攻击?
  8. VS导入easyx图形库
  9. php自动生成phpunit,PHP单元测试框架PHPUnit的使用
  10. Bart模型应用实例及解析(一)————基于波士顿房价数据集的回归模型
  11. MAC电脑小Tips——rar文件解压思路等
  12. 软件测试时印象深刻的bug案例,请问你遇到过哪些印象深刻的bug,接口测试出现bug的原因有哪些?...
  13. allure定制测试报告,修改allure报告标题及logo
  14. HCIP-DATACOM H12-831(41-60)
  15. java 读取excel表格_Java读取excel表格(原理+实现)
  16. 【高级篇 / FortiGate-VM】(6.4) ❀ 04. 虚拟 PC 通过 FortiGate VM 上网 ❀ FortiGate 防火墙
  17. Teamcenter Dataset
  18. 浙江大学 数据结构 陈越姥姥 百度网盘
  19. 仿淘宝右侧tab栏切换
  20. 10、(go语言)文本文件处理

热门文章

  1. CVPR2020 Oral | 华为开源只有加法的神经网络,实习生领衔,效果不输传统CNN
  2. 昨日,全球股市进入ICU!89岁股神巴菲特惊叹活久见!苹果微软万亿美金市值摇摇欲坠...
  3. SAP WM初阶之WM层面的移动类型可以配置成后续TO单据自动产生
  4. 制药行业验证过程中的偏差如何处理?
  5. SAP PM入门系列29 - IW65 Display Activities
  6. 搜索引擎的两大问题(1) - 召回
  7. SAP SD基础知识之组织结构
  8. SAP SD基础知识之订单中装运相关的功能 I
  9. 图森无人车联合UCSD新研究:自动驾驶更省油
  10. 谷歌15个人工智能开源免费项目!开发者:懂了