机器学习与计算机视觉深度学习OpenCv

2020机器学习无监督学习(1)

2020-02-04  本文已影响0人  zidea
machine_learning.jpg

流形学习

首先我们知道流形问题也是无参数的模型,而且也是无监督的模型

高维空间

我们生活在世界是 3 维空间,所以对于 3 维以上数据可视化是比较困难的事。但是在机器学习中我们研究样本特征往往是通过向量描述,随着描述和反应样本的特征增加,向量维度也势必不断增加。今天我们当然希望信息越详尽越好,但是这些特征是否有用,我们是否 handle 这么多信息,已经成为我们在数据分析和机器学习上要面对和解决的问题。高维样本在一起构成了高维空间,但是可能这些样本仅占据高维空间一部分,一些特征都是冗余的。

流形学习

流形学习的观点:认为我们所能观察到的数据实际上是由一个低维流形映射到高维空间的。也就是存在高维空间低纬空间。在开始之前,我们先看经典图形帮助我们来分析流形。
我们今天演示实例主要还是用的 sklearn 和 numpy 来进行模型演示,数据可视化还是用 matplotlib ,这里用到 matplotlib 的扩展 mplot3d 来可视化 3d 数据。

from time import time
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import NullFormatter

from sklearn import manifold,datasets

%matplotlib inline
n_pts = 500
X,color = datasets.samples_generator.make_s_curve(n_pts,random_state=0)
fig = plt.figure(figsize=(12,12))
plt.suptitle("S curve with %i points" % (n_pts),fontsize=12)

ax = fig.add_subplot(111,projection='3d')
ax.scatter(X[:,0],X[:,1],X[:,2],c=color,cmap=plt.cm.Spectral,s=125)
ax.view_init(4,-72)
output_2_0.png

这是一个 3D 空间中样本数据分布,我们很容发现可以通过一些操作将 s 曲线延展出曲面可以在 2 维空间呈现出一个平面。

s_curve.png

在上图我们中看一看这里有三个距离dist_1,dist_2dist_3三个距离,其中 dist_3 欧式距离并不能真正反映样本点之间关系。实际样本间距离需要沿着流行进行计算距离。那么我们需要保证在从 3维空间降维到 2维样本点的距离还保持一致。

那么我们今天讨论局部线性嵌入 LLE(Locally Linear Embedding),我们先看一下什么是嵌入。说到嵌入(embedding),我第一个想起的就是词嵌入,word2vec 就是任何词映射为向量,这就是一种词嵌入(word embedding) 这个技术在自然语言处理变得非常重要。嵌入就是讲低纬空间嵌入到高维空间吧,自己理解的。那么谓嵌入就是把表示大量信息的数据通过空间向量将其表示出来。嵌入不仅使用词汇而且使用图形嵌入等。

我们通过简单实例解释一下局部线性嵌入,例如我们有一个系学生成绩样本,在之前我们学习KNN时候举过这样例子,要推测班级中同学的数学成绩,我们可以通过他的好朋友的数学成绩来推测他的数学成绩。我们还知道可以通过对朋友加权重来推测这位学生成绩。这个是我们知道的,这样以此类推我们可以推测他物理成绩、化学成绩。如果现在将这些成绩降维到理科成绩,其实这是一种降维,在推测他理科成绩时候我们还是应该保持在高维空间时他们之间权重。

E(W) = \sum_i |x^{(i)} - \sum_{j=1}^k W_{ij} x^{(j)} | \, \, s.t. \sum_j w_{ij}= 1
我们需要将 M 高维空间映射到低纬 N 空间,我们可用x^{(i)}周围几个点加权后取和来表示x^{(i)},然后将在 N 维空间的x^{(i)} 映射到低纬空间z^{(i)} 并且保持上面x^{(i)}和表示他周围点的关系不变。

也就x^{(i)} 可以通过周围点线性组合来表示来。

\epsilon^{(i)} = ||x^{(i)} - \sum_{j=1}^k w^{(j)}\eta^{(j)}||^2

我们通过 k 个\eta点(位置)乘以一定权重来表示x^{(i)} 他们之间误差为\epsilon^{(i)}
\epsilon^{(i)} = ||\sum_{j=1}^k(x^{(i)} - \eta^{(i)})w^{(j)}||^2
经过一些列推导我们可以得到上面式子。

\epsilon^{(i)} = ||XW||^2

X = \begin{bmatrix} x^{(i)} - \eta^{(1)} \\ x^{(i)} - \eta^{(2)} \\ \vdots \\ x^{(i)} - \eta^{(k)} \end{bmatrix} \, \, W = \begin{bmatrix} w_{i1} \\ w_{i2} \\ \vdots \\ w_{ij} \end{bmatrix}

L = W^TX^TXW - \lambda(1 - I^TW)

向量求导,一个数对于向量求导就是应该是对向量每一个分量求导,所以也应该是一个向量。我们在做向量运算不但要了解运算,还要了解每一个矩阵或向量的具体形状。

\frac{\partial L}{\partial w} = 0 \Rightarrow 2X^TXW - \lambda I^T \Rightarrow W = \frac{\lambda I}{2X^TX} = \frac{\lambda}{2} (X^TX)^{-1}I \tag{1}
\frac{\partial L}{\partial \lambda} = 0 \Rightarrow I^TW= 1 \tag{2}

\begin{aligned} \sum_j w^{(j)} = 1 \\ \sum_j \frac{\lambda}{2} (X^TX)^{-1}I = 1 \\ X^TX = Q^{(i)} \end{aligned}
我们可以回忆一下 X 包含一个 j 维维度,现在 X 已经不是之前数据样本而是 j 维向量,大家可以看看上面推导。我们这里用Q^{(i)}来表示X^TX

w = \frac{\lambda}{2} (Q^{(i)})^{-1}
w^{(j)}_i = \frac{\sum_{m=1}^k(Q^{(i)})_{jm}^{-1}}{\sum_q \sum_p ((Q^{(i)})^{-1})_{pq}}

(待续)
最后希望大家关注我们微信公众号


wechat.jpeg output_2_0.png
上一篇下一篇

猜你喜欢

热点阅读