度量学习系列(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)


相关推荐

  • java caller_callee和caller属性的区别[通俗易懂]

    java caller_callee和caller属性的区别[通俗易懂]在函数内部,有两个特殊的对象:arguments和this。arguments是一个类数组对象,用于存放传入函数中的所有参数。callee是arguments对象的属性,caller是所有函数对象的属性。calleecallee是一个指针,指向拥有当前arguments对象的函数,即返回正在执行的函数本身的引用。使用callee时要注意:1这个属性只有在函数执行时才有效2它有一个length…

    2022年10月29日
  • MySQL安装配置教程(超级详细、保姆级)

    MySQL安装配置教程(超级详细、保姆级)一、下载MySQLMysql官网下载地址https://downloads.mysql.com/archives/installer/1.选择想要安装的版本,本篇文章选择的是5.7.31版本,下面的那个文件,点击Download下载二、安装MySQL1.选择设置类型双击运行mysql-installer-community-5.7.31.0.msi这里选择是自定义安装,所以直接选择“Custom”,点击“Next”“DeveloperDefault”是开发者默认

  • 动作识别调研

    动作识别调研图片来自电影’QuoVadis'(拉丁语,何去何从)(1951)。在发生什么?这些演员正要亲吻对方,还是已经这样做了?《你往何处去?QuoVadis?》,这部完成于一八九六年的著作,

  • hash算法和hash一致性_分布式一致性hash

    hash算法和hash一致性_分布式一致性hash一致性哈希算法(ConsistentHashing)最早在论文《ConsistentHashingandRandomTrees:DistributedCachingProtocolsforRelievingHotSpotsontheWorldWideWeb》中被提出。简单来说,一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^

  • 工作常用linux命令「建议收藏」

    工作常用linux命令「建议收藏」工作常用linux命令超棒的文档:https://man.linuxde.net/xinshoumingling按接触到的时间线来写第一周sudo:sudo+指令sudo执行的指令,就等价于root亲自执行的指令apt-get:ubuntu的。常用sudoapt-getinstall安装软件,因为一般需要root权限来操作,所以一般搭配sudo。apt-get对安装、卸载升级软件提供一条龙服务。yum:centos的安装命令是yuminstall。yum安装完后查看已安装

  • 什么软件可以激活成功教程网址_bya意思

    什么软件可以激活成功教程网址_bya意思国内激活成功教程站点大全![http://blog.csdn.net/netxiaoyue/archive/2005/01/29/273559.aspx]国内激活成功教程站点大全!(强烈推荐)【8DD资源中心】-http://www.18dd.com/精品软件秀-http://www.ohsoft.com/163软件园-http://www.soft163.com/中华激活成功教程联盟

发表回复

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

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