目录
- k近邻学习
- 低维嵌入
- 主成分分析(PCA)
- 核化线性降维(KPCA)
- 流形学习
- 等度量映射(Isomap)
- 局部线性嵌入
- 度量学习
k近邻学习
k 近邻(KNN)学习是一种常用的监督学习方法,其工作机制如下: 给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个"邻居"的信息来进行预测。KNN算法的核心在于计算新样本与训练集中样本的距离,并根据最近邻居的类别来预测新样本的类别。但它仍有不足之处,比如它没有显式的训练过程,在训练阶段仅仅将样本保存而不处理,待收到测试样本之后才处理,这称之为"懒惰学习",反之,在训练阶段就对样本进行处理的方法称之为"急切学习"。下面举一个例子以便于理解:如图所示
当 k取不同值时,分类结果会有显著不同。当k取1或5时,此时判别为正例,当k取3时,判别为反例。
低维嵌入
在高维情形下容易出现数据样本稀疏、 距离计算困难等问题,这称之为"维数灾难",所以我们需要缓解维数灾难,其中一种方法就是降维,也叫作"维数约简",即通过某种数学变换将原始高维属性空间转变为一个低维"子空间",在这个子空间中样本密度大幅提高, 距离计算也变得更为容易。如下图所示
我们可将(a)图中的样本点降维成(b)图中的样子。事实上,在大多数情况下,我们观测或收集到的数据样本虽是高维的,但与学习任务密切相关的也许仅是某个低维分布,即高维空间中的一个低维"嵌入" 。也就是说我们很难处理高维下的样本点,将它们转化为低维,再对它们进行处理。这样做的话有个问题需要解决,那就是要求原始空间中样本之间的距离在低维空间中得以保持,我们可采用多维缩放,下面是其主要操作步骤
主成分分析(PCA)
主成分分析是一种常用的线性降维技术,通过寻找数据的主要成分来降低维度,这些成分是数据方差最大的方向。其算法描述如下:
PCA仅需保留 W与样本的均值向量即可通过简单的向量减法和矩阵–向量乘法将新样本投影至低维空间中。
代码如下:
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 加载数据
data = load_iris()
X = data.data
y = data.target
# 应用PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 可视化结果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.title('PCA of Iris Dataset')
plt.show()
实验结果如图
这里就是我们所要处理的样本点,在二维空间中能更好地处理。
核化线性降维(KPCA)
核化线性降维是一种非线性降维方法,它利用核函数来处理非线性问题。其基本思路是将数据映射到一个高维空间中,在那里数据可能是线性可分的,然后在这个高维空间中执行PCA。由于直接在高维空间中计算可能是昂贵的,因此通过使用核技巧,可以在低维空间中直接计算高维空间中的内积。
比如在上面图a中,样本点是三维空间中的S形曲面,此时若采用线性降维方法对三维空间观察到的样本点进行降维,则将丢失原本的低维结构。而采用非线性降维方法将得到图b的样本点,采用线性降维方法得到图c。
KPCA具体操作步骤如下:
1.选择核函数: 根据问题的特性选择适当的核函数。
2.计算核矩阵: 计算所有样本点之间核函数的值,形成核矩阵。
3.中心化核矩阵: 由于PCA要求数据集是中心化的,因此需要中心化核矩阵。
4.特征值分解: 对中心化的核矩阵进行特征值分解。
5.选取主成分: 选择具有最大特征值的特征向量作为主成分。
6.映射回低维空间: 将数据映射回低维空间。
代码如下:
from sklearn.datasets import make_moons
from sklearn.decomposition import KernelPCA
import numpy as np
import matplotlib.pyplot as plt
# 生成非线性可分的数据
X, y = make_moons(n_samples=100, noise=0.1)
# 使用RBF核函数的KPCA
kpca = KernelPCA(n_components=2, kernel='rbf', gamma=15)
X_kpca = kpca.fit_transform(X)
# 可视化降维结果
plt.figure(figsize=(8, 6))
plt.scatter(X_kpca[y == 0, 0], X_kpca[y == 0, 1], color='red', marker='^', alpha=0.5)
plt.scatter(X_kpca[y == 1, 0], X_kpca[y == 1, 1], color='blue', marker='o', alpha=0.5)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('Kernel PCA with RBF Kernel')
plt.grid()
plt.show()
运行结果如下:
流形学习
流形学习是一类借鉴了拓扑流形概念的降维方法。 "流形"是在局部与欧氏空间同胚的空间,换言之,它在局部具有欧氏空间的性质,能用欧氏距离来进行距离计算。下面介绍两种著名的流形学习方法。
等度量映射(Isomap)
Isomap算法的核心在于它不是简单地使用欧几里得距离来衡量数据点之间的相似性,而是使用了测地距离。测地距离是指沿着流形表面两点之间的最短路径距离。通过这种方式,Isomap能够更好地保持数据的全局结构,即使在非线性流形上也是如此
如上图所示,红色是测地距离,黑色是近邻距离。测地线距离是两点之间
的本真距离.显然,直接在高维空间中计算直线距离是不恰当的。
Isomap算法描述如下:
代码如下:
from sklearn.manifold import Isomap
# 应用Isomap
isomap = Isomap(n_components=2)
X_isomap = isomap.fit_transform(X)
# 可视化结果
plt.scatter(X_isomap[:, 0], X_isomap[:, 1], c=y, cmap='viridis')
plt.xlabel('First Isomap Component')
plt.ylabel('Second Isomap Component')
plt.title('Isomap of Iris Dataset')
plt.show()
运行结果如下:
局部线性嵌入
与 Isomap 试图保持近邻样本之间的距离不同,局部线性嵌入(LLE)试图保持邻域内样本之间的线性关系。如下图所示
x
i
x_{i}
xi希望能通过它的邻域样本
x
j
x_{j}
xj、
x
k
x_{k}
xk、
x
l
x_{l}
xl的坐标表示,假设通过下面公式表示
x
i
x_{i}
xi的坐标,即
x
i
=
w
i
j
x
j
+
w
i
k
x
k
+
w
i
l
x
l
x_{i}=w_{ij}x_{j}+w_{ik}x_{k}+w_{il}x_{l}
xi=wijxj+wikxk+wilxl
其算法描述如下所示
算法第4行显示出:对于不在样本
x
i
x_{i}
xi邻域区域的样本
x
j
x_{j}
xj,无论其如何变化都对
x
i
x_{i}
xi和
z
i
z_{i}
zi没有任何影响
度量学习
度量学习的目标是调整度量标准,使得分类或识别的效果更好。这通常涉及到学习一个映射函数,将数据点映射到一个新的空间中,使得在这个空间中,相似的数据点距离较近,而不相似的数据点距离较远。
度量学习的实现方法:
1.对比损失:对比损失函数旨在最小化相似数据点之间的距离,同时最大化不相似数据点之间的距离。
2.三元组损失:三元组损失函数使用三元组(锚点、正样本、负样本)来训练模型,使得锚点和正样本之间的距离小于锚点和负样本之间的距离。