精华内容
下载资源
问答
  • 度量学习

    2020-12-26 15:51:30
    度量学习(MetricLearning) 度量(Metric)的定义 在数学中,一个度量(或距离函数)是一个定义集合中元素之间距离的函数。一个具有度量的集合被称为度量空间。 1为什么要用度量学习? 很多的算法越来越依赖于...

    转载:https://blog.csdn.net/Nehemiah_Li/article/details/44230053

    度量学习(Metric Learning)

    度量(Metric)的定义 

    在数学中,一个度量(或距离函数)是一个定义集合中元素之间距离的函数。一个具有度量的集合被称为度量空间。

    1 为什么要用度量学习?

    很多的算法越来越依赖于在输入空间给定的好的度量。例如K-means、K近邻方法、SVM等算法需要给定好的度量来反映数据间存在的一些重要关系。这一问题在无监督的方法(如聚类)中尤为明显。举一个实际的例子,考虑图1的问题,假设我们需要计算这些图像之间的相似度(或距离,下同)(例如用于聚类或近邻分类)。面临的一个基本的问题是如何获取图像之间的相似度,例如如果我们的目标是识别人脸,那么就需要构建一个距离函数去强化合适的特征(如发色,脸型等);而如果我们的目标是识别姿势,那么就需要构建一个捕获姿势相似度的距离函数。为了处理各种各样的特征相似度,我们可以在特定的任务通过选择合适的特征并手动构建距离函数。然而这种方法会需要很大的人工投入,也可能对数据的改变非常不鲁棒。度量学习作为一个理想的替代,可以根据不同的任务来自主学习出针对某个特定任务的度量距离函数。

     

    图 1

    2 度量学习的方法

    根据相关论文[2,3,4],度量学习方法可以分为通过线性变换的度量学习和度量学习的非线性模型。

    2.1 通过线性变换的度量学习

    由于线性度量学习具有简洁性和可扩展性(通过核方法可扩展为非线性度量方法),现今的研究重点放在了线性度量学习问题上。线性的度量学习问题也称为马氏度量学习问题,可以分为监督的和非监督的学习算法。

    监督的马氏度量学习可以分为以下两种基本类型:

    I 监督的全局度量学习:该类型的算法充分利用数据的标签信息。如

     

     

    • Information-theoretic metric learning(ITML)
    • Mahalanobis Metric Learning for Clustering([1]中的度量学习方法,有时也称为MMC)
    • Maximally Collapsing Metric Learning (MCML)

     

     

    II 监督的局部度量学习:该类型的算法同时考虑数据的标签信息和数据点之间的几何关系。如

     

     

    • Neighbourhood Components Analysis (NCA)
    • Large-Margin Nearest Neighbors (LMNN)
    • Relevant Component Analysis(RCA)
    • Local Linear Discriminative Analysis(Local LDA)

     

     

    此外,一些很经典的非监督线性降维算法可以看作属于非监督的马氏度量学习。如

     

    •  主成分分析(Pricipal Components Analysis, PCA)
    • 多维尺度变换(Multi-dimensional Scaling, MDS)
    • 非负矩阵分解(Non-negative Matrix Factorization,NMF)
    • 独立成分分析(Independent components analysis, ICA)
    • 邻域保持嵌入(Neighborhood Preserving Embedding,NPE)
    • 局部保留投影(Locality Preserving Projections. LPP)

     

     

    2.2 度量学习的非线性模型

    非线性的度量学习更加的一般化,非线性降维算法可以看作属于非线性度量学习。经典的算法有等距映射(Isometric Mapping,ISOMAP) 、局部线性嵌入(Locally Linear Embedding, LLE) ,以及拉普拉斯特征映射(Laplacian Eigenmap,LE ) 等。另一个学习非线性映射的有效手段是通过核方法来对线性映射进行扩展。此外还有如下几个方面

     

     

    • Non-Mahalanobis Local Distance Functions
    • Mahalanobis Local Distance Functions
    • Metric Learning with Neural Networks

     

    3 应用

    度量学习已应用于计算机视觉中的图像检索和分类、人脸识别、人类活动识别和姿势估计,文本分析和一些其他领域如音乐分析,自动化的项目调试,微阵列数据分析等[4]。

    推荐阅读的论文

    以下列举的论文大都对后来度量学习产生了很大影响(最高的google引用量上了5000次)。1-6篇论文是关于一些方法的论文,最后一篇为综述。

     

     

    • Distance metric learning with application to clustering with side-information
    • Information-theoretic metric learning(关于ITML)
    • Distance metric learning for large margin nearest neighbor classification(关于LMNN)
    • Learning the parts of objects by non-negative matrix factorization(Nature关于RCA的文章)
    • Neighbourhood components analysis(关于NCA)
    • Metric Learning by Collapsing Classes(关于MCML)
    • Distance metric learning a comprehensive survey(一篇经典的综述)

     

    机器学习数据集

    UCI machine learning repository:http://archive.ics.uci.edu/ml/

     

     

    参考文献

    [1] Xing E P, Jordan M I, Russell S, et al. Distance metric learning with application to clustering with side-information[C]//Advances in neural information processing systems. 2002: 505-512.

    [2] Kulis B. Metric learning: A survey[J]. Foundations and Trends in Machine Learning, 2012, 5(4): 287-364.

    [3] Yang L, Jin R. Distance metric learning: A comprehensive survey[J]. Michigan State Universiy, 2006, 2.

    [4]王微. 融合全局和局部信息的度量学习方法研究[D]. 中国科学技术大学, 2014.

    展开全文
  • 弱监督度量学习算法利用比有监督度量学习较弱的数据点信息。与有监督度量学习算法不同,弱监督度量学习利用相似或不相似的数据点构成的元组来学习,而不是直接利用有标签的数据来学习。 1. 通用API 1.1 输入数据 ...

    弱监督度量学习算法利用比有监督度量学习较弱的数据点信息。与有监督度量学习算法不同,弱监督度量学习利用相似或不相似的数据点构成的元组来学习,而不是直接利用有标签的数据来学习。

    1. 通用API

    1.1 输入数据

    下面将介绍元组,元组可以是对,三元组,四元组等,不同的度量学习算法所需的元组形式不同。

    1.1.1 基本形式

    每个弱监督算法都以元组作为输入,如果需要的话,还需要为这些元组添加标签(语义表示元组中的各数据点的关系)。这些元组也被称为约束。元组中包含一系列要考虑的点(例如:两个点,三个点等等),标签是关于这一系列点的信息(例如,这两个点是相似的)。此处需要注意的,这些元组的顺序也包含了一些信息,例如基于四元组的度量学习。

    对于弱监督度量学习算法来说,tuple的意义,就好比有监督度量学习算法中的xx。弱监督度量学习的第二个参数是元组的标签,它的语义取决于使用的算法。例如,一个包含两个数据点的二元组,它的标签表明这两个数据是相似的还是不同的。

    然后,可以利用元组以及对应的标签来学习:

    >>> my_algo.fit(tuples, y)
    

    我们也可以将元组与标签组成数据集拆分成训练集与测试集。

    >>> from sklearn.model_selection import train_test_split
    >>> pairs_train, pairs_test, y_train, y_test = train_test_split(pairs, y)
    

    有两种方式来组织元组。

    1.1.2 元组的3D数组

    最直接的表示元组的方法是为算法提供3D数组形式的元组,大小为(n_tuples, t, n_features)n_tuples为元组的个数,t为元组中数据点的个数,n_features为数据点的特征个数。

    >>> import numpy as np
    >>> tuples = np.array([[[-0.12, -1.21, -0.20],
    >>>                     [+0.05, -0.19, -0.05]],
    >>>
    >>>                    [[-2.16, +0.11, -0.02],
    >>>                     [+1.58, +0.16, +0.93]],
    >>>
    >>>                    [[+1.58, +0.16, +0.93],  # same as tuples[1, 1, :]
    >>>                     [+0.89, -0.34, +2.41]],
    >>>
    >>>                    [[-0.12, -1.21, -0.20],  # same as tuples[0, 0, :]
    >>>                     [-2.16, +0.11, -0.02]]])  # same as tuples[1, 0, :]
    >>> y = np.array([-1, 1, 1, -1])
    

    提示:不建议对大数量的元组用上面这种方式,因为它的表示是信息冗余的,且是大量的信息冗余,因此占用大量内存。实际上,数据点的每个特征向量将被复制到元组中对应的位置。对于拥有大量元组的情况,采用下面的方法更为有效。

    1.1.3 2D数据指示器+处理器

    在表示大数量的元组时,更有效的表示是直接利用包含数据点的数据集存储数据点的信息,然后利用元组中数据点在数据集中的对应索引值来表示该数据点。

    >>> X = np.array([[-0.12, -1.21, -0.20],
    >>>               [+0.05, -0.19, -0.05],
    >>>               [-2.16, +0.11, -0.02],
    >>>               [+1.58, +0.16, +0.93],
    >>>               [+0.89, -0.34, +2.41]])
    >>>
    >>> tuples_indices = np.array([[0, 1],
    >>>                            [2, 3],
    >>>                            [3, 4],
    >>>                            [0, 2]])
    >>> y = np.array([-1, 1, 1, -1])
    

    1.2 Fit, transform, and so on

    弱监督度量学习算法的目的是在考虑元组约束的前提下将数据点转换到新的空间。

    >>> from metric_learn import MMC
    >>> mmc = MMC(random_state=42)
    >>> mmc.fit(tuples, y)
    MMC(A0='deprecated', convergence_threshold=0.001, diagonal=False,
      diagonal_c=1.0, init=None, max_iter=100, max_proj=10000,
      preprocessor=None, random_state=42, verbose=False)
    

    或者直接利用预算理器:

    >>> from metric_learn import MMC
    >>> mmc = MMC(preprocessor=X, random_state=42)
    >>> mmc.fit(pairs_indice, y)
    

    此时,估计器已经经过学习了,你可以有多种目的来用这个估计器。

    首先,你可以将新数据转换到学习到的空间,利用transform:此处,我们将两个数据点转换到新的嵌入的空间。

    >>> X_new = np.array([[9.4, 4.1, 4.2], [2.1, 4.4, 2.3]])
    >>> mmc.transform(X_new)
    array([[-3.24667162e+01,  4.62622348e-07,  3.88325421e-08],
           [-3.61531114e+01,  4.86778289e-07,  2.12654397e-08]])
    

    像前几篇介绍的,我们的度量学习器也得到了点与点之间的距离,所以我们可以这样用:

    • score_pairs
    >>> mmc.score_pairs([[[3.5, 3.6, 5.2], [5.6, 2.4, 6.7]],
    ...                  [[1.2, 4.2, 7.7], [2.1, 6.4, 0.9]]])
    array([7.27607365, 0.88853014])
    
    • get_metric
    >>> metric_fun = mmc.get_metric()
    >>> metric_fun([3.5, 3.6, 5.2], [5.6, 2.4, 6.7])
    7.276073646278203
    

    也可以利用get_mahalanobis_matrix得到马氏矩阵:

    >>> mmc.get_mahalanobis_matrix()
    array([[ 0.58603894, -5.69883982, -1.66614919],
           [-5.69883982, 55.41743549, 16.20219519],
           [-1.66614919, 16.20219519,  4.73697721]])
    

    1.3 预测与评分

    >>> from metric_learn import MMC
    >>> import numpy as np
    >>> from sklearn.datasets import load_iris
    >>> from sklearn.model_selection import cross_val_score
    >>> rng = np.random.RandomState(42)
    >>> X, _ = load_iris(return_X_y=True)
    >>> # let's sample 30 random pairs and labels of pairs
    >>> pairs_indices = rng.randint(X.shape[0], size=(30, 2))
    >>> y = 2 * rng.randint(2, size=30) - 1
    >>> mmc = MMC(preprocessor=X)
    >>> cross_val_score(mmc, pairs_indices, y)
    

    2. 基于二元组的学习

    2.1 Fitting

    >>> from metric_learn import MMC
    >>> pairs = np.array([[[1.2, 3.2], [2.3, 5.5]],
    >>>                   [[4.5, 2.3], [2.1, 2.3]]])
    >>> y_pairs = np.array([1, -1])
    >>> mmc = MMC(random_state=42)
    >>> mmc.fit(pairs, y_pairs)
    MMC(A0='deprecated', convergence_threshold=0.001, diagonal=False,
        diagonal_c=1.0, init=None, max_iter=100, max_proj=10000, preprocessor=None,
        random_state=42, verbose=False)
    

    此处,我们学习到了一个度量,该度量将第一个元组中的两个数据的距离拉的更近,而将第二个元组的数据的距离拉远。

    2.2 预测

    >>> mmc.predict([[[0.6, 1.6], [1.15, 2.75]],
    ...              [[3.2, 1.1], [5.4, 6.1]]])
    array([1, -1])
    

    我们需要设定预测阈值,然后才可以根据计算出的距离来判定两数据是同类还是异类。可以利用如下三种方式设定预测的阈值:

    • Calibration at fit time:
    >>> mmc.fit(pairs, y) # will fit the threshold automatically after fitting
    
    • Calibration on validation set:
    >>> mmc.calibrate_threshold(pairs, y)
    
    • Manual threshold:
    >>> mmc.set_threshold(0.4)
    

    2.3 评分

    基于数据对的度量学习器可以返回一个decision_function,该函数可以对一系列数据对进行评分,也即两数据在新空间的距离,该距离也可以用来判定最终这两个数据是否为同一类。

    >>> mmc.decision_function([[[0.6, 1.6], [1.15, 2.75]],
    ...                        [[3.2, 1.1], [5.4, 6.1]]])
    array([-0.12811124, -0.74750256])
    

    另外的一些评价:

    >>> from sklearn.model_selection import cross_val_score
    >>> pairs_test = np.array([[[0.6, 1.6], [1.15, 2.75]],
    ...                        [[3.2, 1.1], [5.4, 6.1]],
    ...                        [[7.7, 5.6], [1.23, 8.4]]])
    >>> y_test = np.array([-1., 1., -1.])
    >>> cross_val_score(mmc, pairs_test, y_test, scoring='accuracy')
    array([1., 0., 1.])
    
    >>> pairs_test = np.array([[[0.6, 1.6], [1.15, 2.75]],
    ...                        [[3.2, 1.1], [5.4, 6.1]],
    ...                        [[7.7, 5.6], [1.23, 8.4]]])
    >>> y_test = np.array([1., -1., -1.])
    >>> mmc.score(pairs_test, y_test)
    1.0
    

    2.4 算法

    2.4.1 ITML

    信息理论度量学习 Information Theoretic Metric Learning (ITML)

    ITML通过最小化两个在马氏距离约束下的多高斯分布的相对熵,又名Kullback-Leibler divergence(KL分歧),通过最小化受线性约束的LogDet散度,可以将其表述为Bregman优化问题。该算法可以处理各种各样的约束,并可以选择加入一个先验的距离函数。与其他方法不同,ITML不依赖于特征值计算或半定规划。

    给定一个由矩阵A\mathbf{A}参数化的马氏距离,它可以表示成一个多变量高斯函数:

    p(x;A)=1Zexp(12dA(x,μ))=1Zexp(12((xμ)TA(xμ)) p(\mathbf{x} ; \mathbf{A})=\frac{1}{Z} \exp \left(-\frac{1}{2} d_{\mathbf{A}}(\mathbf{x}, \mu)\right)=\frac{1}{Z} \exp \left(-\frac{1}{2}\left((\mathbf{x}-\mu)^{T} \mathbf{A}(\mathbf{x}-\mu)\right)\right.

    此处,ZZ是一个归一化常数,马氏矩阵A1\mathbf{A}^{-1}正好为高斯函数的协方差矩阵。

    给定一系列相似的点对S\mathbf{S}以及一系列不相似的点对D\mathbf{D},度量学习问题变成最小化如下所示的LogDet分歧(问题也可等价为最小化KL(p(x;A0)p(x;A))\mathbf{K L}\left(p\left(\mathbf{x} ; \mathbf{A}_{0}\right) \| p(\mathbf{x} ; \mathbf{A})\right)):

    minADd(A,A0)=tr(AA01)logdet(AA01)n subject to dA(xi,xj)u(xi,xj)SdA(xi,xj)l(xi,xj)D \begin{aligned} \min _{\mathbf{A}} D_{\ell \mathrm{d}}\left(A, A_{0}\right)=& \operatorname{tr}\left(A A_{0}^{-1}\right)-\log \operatorname{det}\left(A A_{0}^{-1}\right)-n \\ \text { subject to } & d_{\mathbf{A}}\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right) \leq u \quad\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right) \in S \\ & d_{\mathbf{A}}\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right) \geq l \quad\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right) \in D \end{aligned}

    此处,uull分别为相似与不相杺对的距离上下限,A0\mathbf{A_0}为先验的距离度量,默认设定为单位阵,Dld(.)D_{ld}(.)为对数行列式。

    from metric_learn import ITML
    
    pairs = [[[1.2, 7.5], [1.3, 1.5]],
             [[6.4, 2.6], [6.2, 9.7]],
             [[1.3, 4.5], [3.2, 4.6]],
             [[6.2, 5.5], [5.4, 5.4]]]
    y = [1, 1, -1, -1]
    
    # in this task we want points where the first feature is close to be closer
    # to each other, no matter how close the second feature is
    
    
    itml = ITML()
    itml.fit(pairs, y)
    

    References:

    [1] Jason V. Davis, et al. Information-theoretic Metric Learning. ICML 2007
    [2] Adapted from Matlab code at http://www.cs.utexas.edu/users/pjain/itml/

    2.4.2 SDML

    稀疏高维度量学习 Sparse High-Dimensional Metric Learning (SDML)

    SDML是一个能高效应对高维空间的稀疏度量学习方法,SDML中包含双正则化:一个关于偏离单位对角阵的KaTeX parse error: Expected '}', got 'EOF' at end of input: \mathbf{M的L1-惩罚项,另一个是M\mathbf{M}M0\mathbf{M_0}(被设置为I\mathbf{I}Ω1\mathbf{\Omega}^{-1},Ω\mathbf{\Omega}为协方差矩阵)之间的对数行列式差异。

    对于半正定矩阵M\mathbf{M}的这种最优化目标函数形式是凸的。
    minM=tr((M0+ηXLXT)M)logdetM+λM1,off \min _{\mathbf{M}}=\operatorname{tr}\left(\left(\mathbf{M}_{0}+\eta \mathbf{X} \mathbf{L} \mathbf{X}^{T}\right) \cdot \mathbf{M}\right)-\log \operatorname{det} \mathbf{M}+\lambda\|\mathbf{M}\|_{1, o f f}
    此处,X=[x1,x2,...,xn]\mathbf{X}=[\mathbf{x_1}, \mathbf{x_2}, ..., \mathbf{x_n}]为训练数据,指示矩阵Kij=1\mathbf{K}_{ij}=1表明(xi,xj)(\mathbf{x_i}, \mathbf{x_j})是一个相似对,否则为不相似对。Laplacian矩阵L=DK\mathbf{L}=\mathbf{D}-\mathbf{K},其中D\mathbf{D}为一个单位阵,它的对角元素为K\mathbf{K}的行和,.1,off||.||_{1, off}为偏离对角阵的L1规范。

    from metric_learn import SDML
    
    pairs = [[[1.2, 7.5], [1.3, 1.5]],
             [[6.4, 2.6], [6.2, 9.7]],
             [[1.3, 4.5], [3.2, 4.6]],
             [[6.2, 5.5], [5.4, 5.4]]]
    y = [1, 1, -1, -1]
    
    # in this task we want points where the first feature is close to be closer
    # to each other, no matter how close the second feature is
    
    sdml = SDML()
    sdml.fit(pairs, y)
    

    References:

    [1] Qi et al. An efficient sparse metric learning in high-dimensional space via L1-penalized log-determinant regularization. ICML 2009.
    [2] Adapted from https://gist.github.com/kcarnold/5439945

    2.4.3 RCA

    相对成分分析 Relative Components Analysis (RCA)
    RCA根据块内协方差矩阵的加权和学习一个满秩的马氏距离度量,它采用全局线性变换,将较大的权重分配给相关维,将较小的权重分配给不相关维。这些相关的维度是使用“chunklet”(已知属于同一类的点的子集)来估计的。

    对于具有nn个训练点和kk块的训练集,该算法的有效是由于只是简单的计算下式

    C=1nj=1ki=1nj(xjim^j)(xjim^j)T \mathbf{C}=\frac{1}{n} \sum_{j=1}^{k} \sum_{i=1}^{n_{j}}\left(\mathbf{x}_{j i}-\hat{\mathbf{m}}_{j}\right)\left(\mathbf{x}_{j i}-\hat{\mathbf{m}}_{j}\right)^{T}
    此处,块jj的数据为{xji}i=1nj\{\mathbf{x_{ji}}\}_{i=1}^{n_j},数据集的均值为m^j\hat{m}_jC1\mathbf{C}^{-1}的逆为马氏矩阵。

    from metric_learn import RCA
    
    pairs = [[[1.2, 7.5], [1.3, 1.5]],
             [[6.4, 2.6], [6.2, 9.7]],
             [[1.3, 4.5], [3.2, 4.6]],
             [[6.2, 5.5], [5.4, 5.4]]]
    y = [1, 1, -1, -1]
    
    # in this task we want points where the first feature is close to be closer
    # to each other, no matter how close the second feature is
    
    rca = RCA()
    rca.fit(pairs, y)
    

    References:

    [1] Shental et al. Adjustment learning and relevant component analysis. ECCV 2002
    [2] Bar-Hillel et al. Learning distance functions using equivalence relations. ICML 2003
    [3] Bar-Hillel et al. Learning a Mahalanobis metric from equivalence constraints. JMLR 2005

    2.4.4 MMC

    基于边信息聚类的度量学习 Metric Learning with Application for Clustering with Side Information (MMC)

    MMC最小化相似点之间的距离平方和,同时使不同点之间的距离的和大于1。这就构成了一个凸的,没有局部最小问题的优化问题。该问题可以很有效的被求解。该方法的难点是涉及到特征值的计算,这限制了MMC算法的速度。MMC最初是针对聚类问题而设计的,因此它假定所有的类都是单独的聚集,并遵循各自的分布。

    该算法的优化目标函数如下:

    minMS+d(xi,xj)SdM(xi,xj) s.t. (xi,x)DdM2(xi,xj)1 \min _{\mathbf{M} \in \mathrm{S}_{+}^{d}} \sum_{\left(\mathrm{x}_{i}, \mathrm{x}_{j}\right) \in S} d_{\mathrm{M}}\left(\mathrm{x}_{i}, \mathrm{x}_{j}\right) \quad \text { s.t. } \quad \sum_{\left(\mathrm{x}_{i}, \mathrm{x}\right) \in D} d_{\mathrm{M}}^{2}\left(\mathrm{x}_{i}, \mathrm{x}_{j}\right) \geq 1

    from metric_learn import MMC
    
    pairs = [[[1.2, 7.5], [1.3, 1.5]],
             [[6.4, 2.6], [6.2, 9.7]],
             [[1.3, 4.5], [3.2, 4.6]],
             [[6.2, 5.5], [5.4, 5.4]]]
    y = [1, 1, -1, -1]
    
    # in this task we want points where the first feature is close to be closer
    # to each other, no matter how close the second feature is
    
    mmc = MMC()
    mmc.fit(pairs, y)
    

    References:

    [1] Xing et al. Distance metric learning with application to clustering with side-information. NIPS 2002
    [2] Adapted from Matlab code http://www.cs.cmu.edu/%7Eepxing/papers/Old_papers/code_Metric_online.tar.gz

    3. 基于四元组的学习

    一些度量学习算法对四元组样本进行学习。在这种情况下,应该为算法提供n_samples四元组的点。每个四元组的语义是前两点比后两点靠得更近。

    3.1 Fitting

    以下是一个关于四元组度量学习的例子。

    >>> from metric_learn import LSML
    >>> quadruplets = np.array([[[1.2, 3.2], [2.3, 5.5], [2.4, 6.7], [2.1, 0.6]],
    >>>                         [[4.5, 2.3], [2.1, 2.3], [0.6, 1.2], [7.3, 3.4]]])
    >>> lsml = LSML(random_state=42)
    >>> lsml.fit(quadruplets)
    LSML(max_iter=1000, preprocessor=None, prior=None, random_state=42, tol=0.001,
       verbose=False)
    

    或者:

    >>> X = np.array([[1.2, 3.2],
    >>>               [2.3, 5.5],
    >>>               [2.4, 6.7],
    >>>               [2.1, 0.6],
    >>>               [4.5, 2.3],
    >>>               [2.1, 2.3],
    >>>               [0.6, 1.2],
    >>>               [7.3, 3.4]])
    >>> quadruplets_indices = np.array([[0, 1, 2, 3], [4, 5, 6, 7]])
    >>> lsml = LSML(preprocessor=X, random_state=42)
    >>> lsml.fit(quadruplets_indices)
    LSML(max_iter=1000,
       preprocessor=array([[1.2, 3.2],
           [2.3, 5.5],
           [2.4, 6.7],
           [2.1, 0.6],
           [4.5, 2.3],
           [2.1, 2.3],
           [0.6, 1.2],
           [7.3, 3.4]]),
       prior=None, random_state=42, tol=0.001, verbose=False)
    

    此处,我们想得到一个度量,该度量使得每个四元组中的前两个点的距离比后两个点的距离更近。

    3.2 预测

    >>> quadruplets_test = np.array(
    ... [[[5.6, 5.3], [2.2, 2.1], [0.4, 0.6], [1.2, 3.4]],
    ...  [[6.0, 4.2], [4.3, 1.2], [4.5, 0.6], [0.1, 7.8]]])
    >>> lsml.predict(quadruplets_test)
    array([-1.,  1.])
    

    3.3 评价

    >>> lsml.decision_function(quadruplets_test)
    array([-1.75700306,  4.98982131])
    
    >>> from sklearn.model_selection import cross_val_score
    >>> cross_val_score(lsml, quadruplets, scoring='f1_score')  # this won't work
    
    >>> lsml.score(quadruplets_test)
    0.5
    

    3.4 算法:LSML

    Metric Learning from Relative Comparisons by Minimizing Squared Residual (LSML)

    LSML提出了一种简单而有效的算法,该算法最小化与约束残差平方和相对应的凸目标函数。该算法采用相对距离比较的约束形式,特别适用于不能自然获取成对约束的情况,使得基于成对约束的算法难以部署。此外,当维数较大且只给出少量约束条件时,其稀疏性可使估计更加稳定。
    损失函数中的每一项约束d(xa,xb)<d(xc,xd)d(x_a, x_b)<d(x_c, x_d)表示如下形式:
    H(dM(xa,xb)dM(xc,xd))H\left(d_{\mathbf{M}}\left(\mathbf{x}_{a}, \mathbf{x}_{b}\right)-d_{\mathbf{M}}\left(\mathbf{x}_{c}, \mathbf{x}_{d}\right)\right)

    其中,H(.)H(.)为平方Hinge损失函数:
    H(x)={0x0x2x>0 H(x)=\left\{\begin{array}{cc}{0} & {x \leq 0} \\ {x^{2}} & {x>0}\end{array}\right.
    求和的损失函数L(C)L(C)就是将所有的约束C={(xa,xb,xc,xd):d(xa,xb)<d(xc,xd)}C=\{(x_a, x_b, x_c, x_d):d(x_a, x_b)<d(x_c,x_d)\}加和。在该算法的原论文中,作者建议每个约束应该先乘一个概率值(权值)再加和。此处为了简化,将权值都取为1,也即普通的直接加和。

    优化目标函数如下所示
    minM(Dld(M,M0)+(xa,xb,xc,xd)CH(dM(xa,xb)dM(xc,xc)) \min _{\mathbf{M}}\left(D_{l d}\left(\mathbf{M}, \mathbf{M}_{0}\right)+\sum_{\left(\mathbf{x}_{a}, \mathbf{x}_{b}, \mathbf{x}_{c}, \mathbf{x}_{d}\right) \in C} H\left(d_{\mathbf{M}}\left(\mathbf{x}_{a}, \mathbf{x}_{b}\right)-d_{\mathbf{M}}\left(\mathbf{x}_{c}, \mathbf{x}_{c}\right)\right)\right.
    其中,M0\mathbf{M}_0为先验度量矩阵,通常默认为单位阵。Dld.,.D_{ld}(.,.)为对数行列式分歧:
    Dld(M,M0)=tr(MM0)logdet(M) D_{l d}\left(\mathbf{M}, \mathbf{M}_{0}\right)=\operatorname{tr}\left(\mathbf{M M}_{0}\right)-\operatorname{logdet}(\mathbf{M})

    from metric_learn import LSML
    
    quadruplets = [[[1.2, 7.5], [1.3, 1.5], [6.4, 2.6], [6.2, 9.7]],
                   [[1.3, 4.5], [3.2, 4.6], [6.2, 5.5], [5.4, 5.4]],
                   [[3.2, 7.5], [3.3, 1.5], [8.4, 2.6], [8.2, 9.7]],
                   [[3.3, 4.5], [5.2, 4.6], [8.2, 5.5], [7.4, 5.4]]]
    
    # we want to make closer points where the first feature is close, and
    # further if the second feature is close
    
    lsml = LSML()
    lsml.fit(quadruplets)
    

    References:

    [1] Liu et al. Metric Learning from Relative Comparisons by Minimizing Squared Residual. ICDM 2012
    [2] Adapted from https://gist.github.com/kcarnold/5439917

    展开全文
  • 原文链接:What is Metric Learning? 许多机器学习方法都需要度量...距离度量学习(或者简单的称之为度量学习)旨在自动的从有监督的数据中,以机器学习的方式构造出与任务相关的距离度量。学习到的距离度量可以...

    原文链接:What is Metric Learning?

    许多机器学习方法都需要度量计算数据点之间的距离。传统作法是利用相关领域的先验知识来选择一个标准的距离度量,例如:欧式距离、城市距离、余弦距离,等等。然而,很难针对特定的数据与感举兴趣的任务设计合适的度量。
    距离度量学习(或者简单的称之为度量学习)旨在自动的从有监督的数据中,以机器学习的方式构造出与任务相关的距离度量。学习到的距离度量可以用于不同的任务的任务,例如,K-NN分类、聚类、信息检索。

    1. 问题定义

    根据可依赖的训练数据的形式,可将度量学习问题公成两类:

    • 有监督学习:算法不得不接近一列数据点集,其中的每一个数据有带有类别标签。一般来说,有监督下的度量学习的目的是为了学到这样的距离度量,这个距离度量能够将具有相同标签(同类)的数据点拉近,并将不同标签(异类)的数据点推开
    • 弱监督学习:该算法仅在元组级别(二元组、三元组,或者四元组)的监督下访问一组数据点。这种较弱的监督的一个典型例子是一组正对和负对;在这种情况下,目标是学习一个距离度量,将正对放在一起,负对放在远处。

    2. 马氏距离

    metric-learn包中,所有当前的算法都学习一个被称之为“马氏距离”的度量。给定一个实参数距离LRn×mL\in R^{n\times m},其中nn为维数,mm为数据的特征个数。马氏距离可以表示成如下形式:
    D(x,x)=(LxLx)T(LxLx)D(x,x')=\sqrt{(Lx-Lx')^T(Lx-Lx')}

    换句话说,马氏距离就是特征空间通过矩阵LL做完线性变换后的欧式距离。当LL为单位阵时,马氏距离就等于欧式距离。马氏距离的度量学习可以看作是学习一个新的nn维嵌入空间。注意到,当nn是比mm要小时,达到降维的效果。

    严格意义上,马氏距离是一种伪度量:它满足度量的三个特性(非负,对称,三角不等式)。

    注意:马氏距离也可以参数化为一个半正定的矩阵MM
    D(x,x)=(xx)TM(xx)D(x,x')=\sqrt{(x-x')^TM(x-x')}
    此处,M=LTLM=L^TL。因此,对该度量学习问题的求解可是求解MM,也可以是LL

    3. 用途

    度量学习的用途有很多,我们下面介绍一些受欢迎的例子。具体例子请看example

    • 最近邻模型:学习到的度量能够用来提升最近邻学习模型的分类、回归、自动检测的性能;
    • 聚类:度量学习能够提供一种方法,可以使算法(如K-Means)发现聚类更倾向于预期的语义;
    • 信息检索:学习到的度量可以用来检索在数据集中与查询元素在语义上更紧密的目标;
    • 降维:度量学习可以被当作在弱监督设置下的一种降维方法;
    • 更一般地,学到的变换矩阵LL能够用于将数据映射到一个新的嵌入空间,进行降维,接着用于后续的机器学习算法。

    metric-learn包的应用接口是基于scikit-learn。我们能很方便地将度量学习器与其它基于scikit-learn的估计器实现其它用途。

    4. 补充阅读

    关于更多度量学习的信息与应用,我们可以参考以下文献:

    展开全文
  • 无监督距离度量学习工具包:Matlab中无监督距离度量学习工具包
  • 度量学习算法

    2016-11-17 14:30:03
    是一种度量学习算法
  • 度量学习C++程序

    2019-03-28 14:57:29
    度量学习C++程序
  • 度量学习入门

    2019-04-15 17:05:11
    Metric Learning——度量学习 度量学习 (Metric Learning)(一) 度量学习 度量函数 metric learning deep metric learning 深度度量学习 度量学习(metric learning)损失函数 ...
    展开全文
  • 锚定内核度量学习

    2021-03-14 13:51:35
    锚定内核度量学习
  • 有监督度量学习算法利用输入点xxx与目标标签yyy作为来学习一个距离矩阵,这个距离矩阵拉近同类别的点(分类问题)或者目标值邻近的点(回归问题)的距离,并使不同类别或目标值相差大的点的互相远离。 1. 通用API ...
  • 零射击度量学习

    2021-03-08 22:26:59
    在这项工作中,我们解决了零射击度量学习问题,并提出了一种缩写为ZSML的新方法,目的是学习一种用于度量未见类别(甚至是未见数据集)相似度的距离度量。 ZSML通过捕获数据之间的多非线性但连续的关系来实现强大的...
  • 降维和度量学习是机器学习中的很重要的模块。降维,高纬度数据转化为低纬度的数据,主要是属性变化。本课程主要讲解:k近邻学习器、低维嵌入、主成成分分析、核化线性降维、流行学习、度量学习
  • 度量学习以重新识别人
  • 在推荐系统中,通过学习联合度量空间进行编码的协作度量学习(CML),与矩阵因子分解技术相比,不仅用户的首选项,而且用户-用户和项-项相似性都取得了卓越的性能。 但是,如何将社会信息整合到基于度量学习的推荐...
  • 自适应度量学习

    2019-07-02 20:19:00
    为什么学习距离度量? 在机器学习中,对高维数据进行降维的主要目的是希望找到一个合适的低维空间,在此空间中进行学习能...这就是度量学习(metric learning)的基本动机. 在数据分类或者聚类中我们应该让相似数据的...
  • 由于射影空间中存在一种特殊的非欧几里德度量,因此最近在度量学习中引入了Cayley-Klein度量,以处理计算机视觉任务中的复杂数据分布。 在本文中,我们将原始的Cayley-Klein度量标准扩展到multiple.Cayley-Klein度量...
  • 机器学习: Metric Learning (度量学习)

    万次阅读 多人点赞 2018-06-10 15:07:27
    [1] Wikipedia-距离函数 [2] DistLearnKit [3] 基于深度学习的Person Re-ID(度量学习) [4] 度量学习 [5] 度量学习(Distance Metric Learning)介绍
  • 流形正则化转移距离度量学习
  • 提出了一种采用拓扑学习神经网络进行度量学习和嵌入的框架。 为了强调常规嵌入方法(例如多维缩放和Isomap)在时间和空间上效率低下的问题,我们利用了拓扑学习神经网络(例如增长的神经气体和自组织增量)的增量...
  • 度量学习——笔记

    2019-10-12 09:22:12
    度量学习——笔记 本文的目的仅仅是对“度量学习”做一个简单的解释。 1 何为度量学习 度量学习(Metric Learning) 是人脸识别中常用的传统机器学习方法,由Eric Xing在NIPS 2002提出,可以分为两种:一种是通过线性...
  • 度量学习Metric Learning

    千次阅读 2019-01-14 16:13:32
    度量学习 (Metric Learning) == 距离度量学习 (Distance Metric Learning,DML) == 相似度学习  度量学习 是指 距离度量学习,Distance Metric Learning,简称为 DML,是人脸识别中常用传统机器学习方法,由Eric...
  • 在线度量学习代码

    2015-09-11 21:15:37
    这是基于pairwise constraint在线度量学习代码,主要应用了牛顿梯度下降法以及字空间投影

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,514
精华内容 3,405
关键字:

度量学习