度量学习系列(2):有监督度量学习

度量学习系列(2):有监督度量学习有监督度量学习算法利用输入点xxx与目标标签yyy作为来学习一个距离矩阵,这个距离矩阵拉近同类别的点(分类问题)或者目标值邻近的点(回归问题)的距离,并使不同类别或目标值相差大的点的互相远离。1.通用API有监督的度量学习算法实质上利用了与scikit-learn相同的应用程序接口(API)。1.1输入数据为了训练一个模型,我们需要两个array-like对象:XXX与yyy。XX…

大家好,又见面了,我是你们的朋友全栈君。

有监督度量学习算法利用输入点 x x x与目标标签 y y y作为来学习一个距离矩阵,这个距离矩阵拉近同类别的点(分类问题)或者目标值邻近的点(回归问题)的距离,并使不同类别或目标值相差大的点的互相远离。

1. 通用API

有监督的度量学习算法实质上利用了与scikit-learn相同的应用程序接口(API)。

1.1 输入数据

为了训练一个模型,我们需要两个array-like对象: X X X y y y X X X应该为 n × m n \times m n×m的2D数组,其中 n n n为样本的个数, m m m为数据的维数。 y y y为大小为 n n n的一维数组,该数组包含 X X X中每个数据的类别标签(回归问题是为实数,例如度量学习核回归MLKR)。

下面给出用于度量学习的数据例子,数据中包含两种类别:狗与猫。

import numpy as np
X = np.array([[2.3, 3.6], [0.2, 0.5], [6.7, 2.1]])
y = np.array(['dog', 'cat', 'dog'])

注意:我们也可以利用数据预处理器来替代直接给出2D数组形式的输入,详情请查阅Preprocessor一节。

1.2 Fit, transform以及其它

有监督度量学习算法的目标是为了将数据转换到新空间中,在该空间中,同类别的两个数据点的距离会非常小,而不同类别的两个数据的距离则很大。为了得到这个转换矩阵,我们需要利用训练数据来fit度量学习器(例子:最近邻成分分析NCA)。

>>> from metric_learn import NCA
>>> nca = NCA(random_state=42)
>>> nca.fit(X, y)
NCA(init=None, max_iter=100, n_components=None, num_dims='deprecated',
  preprocessor=None, random_state=42, tol=None, verbose=False)

上面的代码块已经fit了度量学习器nca,现在我们可以将nca用于新的数据上。

首先,我们可以利用transform将数据转换到新的状态空间。下面给出转换两个数据到嵌入空间的例子:

>>> X_new = np.array([[9.4, 4.1], [2.1, 4.4]])
>>> nca.transform(X_new)
array([[ 5.91884732, 10.25406973],
       [ 3.1545886 ,  6.80350083]])

通过以上步骤,我们的度量学习器已经学到了数据点之间的距离,我们有以下两种使用它的途径:

  • 我们可以利用score_pairs返回两个数据点之间的距离:
>>> nca.score_pairs([[[3.5, 3.6], [5.6, 2.4]], [[1.2, 4.2], [2.1, 6.4]]])
array([0.49627072, 3.65287282])
  • 也可以利用get_metric函数返回两个数据点之间的距离:
>>> metric_fun = nca.get_metric()
>>> metric_fun([3.5, 3.6], [5.6, 2.4])
0.4962707194621285

注意:如果度量学习是学习马氏距离,我们可以利用get_mahalanobis_matrix得到学习到的矩阵。

>>> nca.get_mahalanobis_matrix()
array([[0.43680409, 0.89169412],
       [0.89169412, 1.9542479 ]])

2. 算法

2.1 LMNN

大边缘最近邻度量学习 Large Margin Nearest Neighbor Metric Learning (LMNN)

LMNN在kNN分类任务的前提下学习一个马氏距离度量。学习到的度量尝试保持同类别的K最近邻很近,并将不同类别的数据以大边缘隔离开来。该算法不对数据的分布作假设。

该距离是通过求解以下优化问题来学习得到的:
m i n L ∑ i , j η i , j ∣ ∣ L ( x i − x j ) ∣ ∣ 2 + c ∑ i , j , l η i , j ( 1 − y i , j ) [ 1 + ∣ ∣ L ( x i − x j ) ∣ ∣ 2 − ∣ ∣ L ( x i − x l ) ∣ ∣ 2 ] + min_{L}\sum_{i,j}\eta_{i,j}||L(x_i-x_j)||^2+c\sum_{i,j,l}\eta_{i,j}(1-y_{i,j})[1+||L(x_i-x_j)||^2-||L(x_i-x_l)||^2]_{+} minLi,jηi,jL(xixj)2+ci,j,lηi,j(1yi,j)[1+L(xixj)2L(xixl)2]+
此处, x i x_i xi为一数据点, x j x_j xj x i x_i xi的一个具有相同标签的k最近邻点, x l x_l xl为所有其它不同标签的k最近邻点, η i , j , y i , j ∈ { 0 , 1 } \eta_{i,j},y_{i,j}\in \{0,1\} ηi,jyi,j{
0,1}
都是指标参数, η i , j \eta_{i,j} ηi,j表示 x j x_j xj为与 x i x_i xi相同标签的k最近邻数, y i , j = 0 y_{i,j}=0 yi,j=0表示 x i , x j x_i,x_j xi,xj属于不同的类别, [ ⋅ ] + [·]_{+} []+表示损失函数Hinge Loss。

import numpy as np
from metric_learn import LMNN
from sklearn.datasets import load_iris

iris_data = load_iris()
X = iris_data['data']
Y = iris_data['target']

lmnn = LMNN(k=5, learn_rate=1e-6)
lmnn.fit(X, Y, verbose=False)

参考文献:
[1] Weinberger et al. Distance Metric Learning for Large Margin Nearest Neighbor Classification. JMLR 2009
[2] Wikipedia entry on Large Margin Nearest Neighbor

2.2 NCA

近邻成分分析 Neighborhood Components Analysis (NCA)

NCA是一个距离度量学习算法,该度量算法旨在提升最近邻分类器的精确度(与传统欧式距离相比较)。算法直接最大化训练集上留一法KNN评价器的随机变量。它也可以用来学习一个低张维度的线性转换矩阵,用于数据可视化和快速分类。

利用分解 M = L T L \mathbf{M}=\mathbf{L}^T\mathbf{L} M=LTL,并定义概率 p i j p_{ij} pij,此概率通过 x i x_i xi的邻居 x j x_j xj来对其进行正确分类的概率,如下通过马氏距离意义下的softmax似然值表示:

p i j = exp ⁡ ( − ∥ L x i − L x j ∥ 2 2 ) ∑ l ≠ i exp ⁡ ( − ∥ L x i − L x l ∥ 2 2 ) , p i i = 0 p_{i j}=\frac{\exp \left(-\left\|\mathbf{L} \mathbf{x}_{i}-\mathbf{L} \mathbf{x}_{j}\right\|_{2}^{2}\right)}{\sum_{l \neq i} \exp \left(-\left\|\mathbf{L} \mathbf{x}_{i}-\mathbf{L} \mathbf{x}_{l}\right\|_{2}^{2}\right)}, \quad p_{i i}=0 pij=l=iexp(LxiLxl22)exp(LxiLxj22),pii=0
对每一个与 x i x_i xi近邻的数据点,我们将上式计算的概率加和得到 x i x_i xi被正确分类的最终概率:
p i = ∑ j : j ≠ i , y j = y i p i j p_{i}=\sum_{j: j \neq i, y_{j}=y_{i}} p_{i j} pi=j:j=i,yj=yipij
优化问题变为找到矩阵 L \mathbf{L} L使得所有数据点的正确分类概率和最大:
L = argmax ⁡ ∑ i p i \mathbf{L}=\operatorname{argmax} \sum_{i} p_{i} L=argmaxipi

import numpy as np
from metric_learn import NCA
from sklearn.datasets import load_iris

iris_data = load_iris()
X = iris_data['data']
Y = iris_data['target']

nca = NCA(max_iter=1000)
nca.fit(X, Y)

参考文献:

[1] Goldberger et al. Neighbourhood Components Analysis. NIPS 2005
[2] Wikipedia entry on Neighborhood Components Analysis

2.3 LFDA

局部Fisher差别分析 Local Fisher Discriminant Analysis (LFDA)

LFDA是一个线性的有监督降维方法。该算法对于多模态问题特别有效,所谓的多模态就是一个或多个类别在状态空间中包含多个独立的聚集。LFDA的核心优化问题是一个广义特征值求解问题。

该算法定义Fisher局部的类内、类间散布矩阵 S ( ω ) / S ( ω ) \mathbf{S}^{(\omega)}/\mathbf{S}^{(\omega)} S(ω)/S(ω)

S ( w ) = 1 2 ∑ i , j = 1 n W i j ( w ) ( x i − x j ) ( x i − x j ) T S ( b ) = 1 2 ∑ i , j = 1 n W i j ( b ) ( x i − x j ) ( x i − x j ) T \begin{aligned} \mathbf{S}^{(w)} &=\frac{1}{2} \sum_{i, j=1}^{n} W_{i j}^{(w)}\left(\mathbf{x}_{i}-\mathbf{x}_{j}\right)\left(\mathbf{x}_{i}-\mathbf{x}_{j}\right)^{T} \\ \mathbf{S}^{(b)} &=\frac{1}{2} \sum_{i, j=1}^{n} W_{i j}^{(b)}\left(\mathbf{x}_{i}-\mathbf{x}_{j}\right)\left(\mathbf{x}_{i}-\mathbf{x}_{j}\right)^{T} \end{aligned} S(w)S(b)=21i,j=1nWij(w)(xixj)(xixj)T=21i,j=1nWij(b)(xixj)(xixj)T

此处,
W i j ( w ) = { 0 y i ≠ y j A i , j / n l y i = y j A i , j ( 1 / n − 1 / n l ) y i = y j \begin{aligned} W_{i j}^{(w)}=\left\{\begin{array}{cc}{0} & {y_{i} \neq y_{j}} \\ {\mathbf{A}_{i, j} / n_{l}} & {y_{i}=y_{j}} \\ {\mathbf{A}_{i, j}\left(1 / n-1 / n_{l}\right)} & {y_{i}=y_{j}}\end{array}\right.\end{aligned} Wij(w)=0Ai,j/nlAi,j(1/n1/nl)yi=yjyi=yjyi=yj

A i , j \mathbf{A}_{i,j} Ai,j为接近矩阵 A \mathbf{A} A ( i , j ) (i,j) (i,j)个元素, A \mathbf{A} A可以根据局部缩放方法来计算。

因此,学习问题变成推导LFDA变换矩阵 T L F D A \mathbf{T}_{LFDA} TLFDA
T L F D A = arg ⁡ max ⁡ T [ tr ⁡ ( ( T T S ( w ) T ) − 1 T T S ( b ) T ) ] \mathbf{T}_{L F D A}=\arg \max _{\mathbf{T}}\left[\operatorname{tr}\left(\left(\mathbf{T}^{T} \mathbf{S}^{(w)} \mathbf{T}\right)^{-1} \mathbf{T}^{T} \mathbf{S}^{(b)} \mathbf{T}\right)\right] TLFDA=argTmax[tr((TTS(w)T)1TTS(b)T)]

得到的变换矩阵 T \mathbf{T} T可保证同类中邻近的数据靠的更近,不同类中的数据离的更远,但是不能保证同类中离的远的数据靠近。

import numpy as np
from metric_learn import LFDA
from sklearn.datasets import load_iris

iris_data = load_iris()
X = iris_data['data']
Y = iris_data['target']

lfda = LFDA(k=2, dim=2)
lfda.fit(X, Y)

参考文献:

[1] Sugiyama. Dimensionality Reduction of Multimodal Labeled Data by Local Fisher Discriminant Analysis. JMLR 2007
[2] Tang. Local Fisher Discriminant Analysis on Beer Style Clustering.

2.4 MLKR

核回归度量学习 Metric Learning for Kernel Regression (MLKR)

MLKR是一个有监督度量学习算法,该算法通过直接最小化留一法回归误差来学习一个距离函数。MLKR可以被看作为一个有监督版本的PCA,能用于降维和高维数据可视化。

理论上,MLKR也能应用于许多不同形式的核函数和距离度量。此处,我们利用高斯核函数与马氏距离。一个高斯核函数如下所示:

k i j = 1 2 π σ exp ⁡ ( − d ( x i , x j ) σ 2 ) k_{i j}=\frac{1}{\sqrt{2 \pi} \sigma} \exp \left(-\frac{d\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)}{\sigma^{2}}\right) kij=2π
σ
1
exp(σ2d(xi,xj))

此处, d ( ⋅ , ⋅ ) d(·,·) d(,)为某一测度下的距离平方,此处该测度为马氏距离,为 d ( x i , x j ) ∣ ∣ A ( x i − x j ) ∣ ∣ d(x_i,x_j)||\mathbf{A}(x_i-x_j)|| d(xi,xj)A(xixj) A \mathbf{A} A为推导出的分解矩阵为: M = A T A \mathbf{M}=\mathbf{A}^T\mathbf{A} M=ATA

σ 2 \sigma^2 σ2可以归并到 d ( ⋅ ) d(·) d()中,此处我们简单的设 σ 2 = 1 \sigma^2=1 σ2=1。我们利用以下在训练样本上的累积留一法二次回归误差作为损失函数:

L = ∑ i ( y i − y ^ i ) 2 \mathcal{L}=\sum_{i}\left(y_{i}-\hat{y}_{i}\right)^{2} L=i(yiy^i)2

此处,预测 y ^ i \hat{y}_i y^i是由核回归器得到的:
y ^ i = ∑ j ≠ i y j k i j ∑ j ≠ i k i j \hat{y}_{i}=\frac{\sum_{j \neq i} y_{j} k_{i j}}{\sum_{j \neq i} k_{i j}} y^i=j=ikijj=iyjkij

from metric_learn import MLKR
from sklearn.datasets import load_iris

iris_data = load_iris()
X = iris_data['data']
Y = iris_data['target']

mlkr = MLKR()
mlkr.fit(X, Y)

参考文献:

[1] Weinberger et al. Metric Learning for Kernel Regression. AISTATS 2007

2.5 有监督版本的弱监督度量学习算法

每一个弱监督度量学习算法都有一个对应的有监督版本*_Supervised,其中,相似元组从标签信息中生成并传递给底层算法。

对于成对的学习者(参见“成对学习”),使用metric_learn.constraints.positive_negative_pair函数采样成对(数据集中两个点的元组)和成对标签(int,表示这两个点是相似的(+1)还是不同的(-1))。为了对(标签+1的)正对进行抽样,该方法将对来自同一标签的所有样本进行抽样,并从中随机抽取一对样本。为了对负对(标签-1)进行抽样,该方法将查看来自不同类的所有样本,并随机抽取其中的一对样本。该方法将尝试构建num_constraints正对和num_constraints负对,但有时它找不到足够的一个,因此强制same_length=True将返回两个lenghts的最小值。
使用四元组学习器(见基于四元组的学习)以监督的方式,积极的和消极的对采样如上和连接,这样我们有一个3维四元组的数组,其中每个成套的一分之二点来自同一个类,最后两个点来自不同的类(事实上类似最后两点应该低于前两个点)。

from metric_learn import MMC_Supervised
from sklearn.datasets import load_iris

iris_data = load_iris()
X = iris_data['data']
Y = iris_data['target']

mmc = MMC_Supervised(num_constraints=200)
mmc.fit(X, Y)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150511.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • virus.win32.parite.H查杀病毒的方法

    virus.win32.parite.H查杀病毒的方法virus.win32.parite.H病毒的查杀方法昨天电脑中了virus.win32.parite.H病毒,搞了2个多小时最终搞定了。以下记录下我的解决方法。第一步:下载Win32.Parite病毒专杀工具下载地址:http://download.csdn.net/detail/wuxiaokaixinguo/6333233第二步…

  • 数据结构与算法Python_数据结构与算法python语言实现

    数据结构与算法Python_数据结构与算法python语言实现我们已经知道算法是具有有限步骤的过程,其最终的目的是为了解决问题,而根据我们的经验,同一个问题的解决方法通常并非唯一。这就产生一个有趣的问题:如何对比用于解决同一问题的不同算法?为了以合理的方式提高程序效率,我们应该知道如何准确评估一个算法的性能。本节学习首先介绍算法分析的重要性,并讲解了分析算法的时间复杂度和空间复杂度分析方法,最后介绍了Python列表和字典常见操作的时间复杂度。

  • springboot springcloud项目实战(阿里云如何搭建服务器)

    https://blog.csdn.net/u010938610/article/details/79282624

  • 为什么从Java开发转测试?

    为什么从Java开发转测试?前言很多粉丝关注我可能是从乐优商城项目关注的,这确实是我曝光度最高的一篇blog了包括现在新增的粉丝的话也是从乐优商城项目blog关注的ps:大家有询问我要源码,我以前是有上传到github上的,但是由于里面用到了阿里云,github天天给我发邮件报警说有风险,然后我就删除了,所以源码的话,现在是没有了的但是我觉得乐优商城过于大,用的技术栈也很多,如果面试的时候不能充分讲明白的话,尽量不要用这个项目去面试大家如果要用他面试的话可以从以下几个思路去讲1、整体是一个什么项目?主体业务流程是什么

  • String与StringBuffer的区别?

    String与StringBuffer的区别?String:1.String创建的对象是不可变的,一旦创建不可改变2.对象值可以改变其实是创建了一个新的对象,然后把新的值保存进去(如图1)3.String类被final修饰,不可以被继承4.String创建的对象的值存在于常量池,不用的时候不会被销毁5.String运行时间较长6.String适用于比较短而小的字符串图1StringBuffer:1.StringBuffer创建的对象是可变的2.它的改变不像String那样重新创建对象,而是通过构造方法(如图2)3.StringBu

  • 正则表达式Python_python正则表达式匹配字符串

    正则表达式Python_python正则表达式匹配字符串转载:https://www.jianshu.com/p/5295c5988b7f一、正则表达式语法(一)字符与字符类1、特殊字符:\.^$?+*{}[]()|以上特殊字符要想使用字面值,必须使用\进行转义。2、字符类包含在[]中的一个或者多个字符被称为字符类,字符类在匹配时如果没有指定量词则只会匹配其中的一个。字符类内可以指定范围,比如[a-zA-Z0-9]表示a到z,A…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号