永朝 發表於 2025-5-28 10:13:00

度量学习:让机器学会“距离”的奥秘

<p><strong>度量学习</strong>是一种神奇的机器学习技术,它的核心目标就是教会机器如何更好地衡量不同数据点之间的 <strong>“距离”</strong> 。</p>
<p>在我们日常生活中,距离这个概念很直观,比如两点之间的直线距离。</p>
<p>但在机器学习的世界里,数据通常是高维的,比如一张图片可以被表示为一个包含像素值的高维向量。</p>
<p>那么,如何衡量这些<strong>高维数据</strong>之间的相似性或差异性呢?</p>
<p>简单来说,<strong>度量学习</strong>就是通过学习一个合适的距离度量函数,使得相似的数据点在度量空间中距离更近,不相似的数据点距离更远。</p>
<p>就好比在一个精心设计的 <strong>“数据地图”</strong> 上,同类事物聚集在一起,不同类别的事物被清晰地分开。</p>
<h1 id="1-度量学习的作用">1. 度量学习的作用</h1>
<p><strong>度量学习</strong>的作用主要体现在三个方面:</p>
<h2 id="11-提升分类和聚类效果">1.1. 提升分类和聚类效果</h2>
<p>在传统的<strong>分类任务</strong>中,比如识别手写数字,我们希望相同数字的图片能够被正确地归为一类。</p>
<p>如果没有一个好的度量方式,模型可能会因为一些微小的笔画差异而将同一个数字的图片分为不同类别。</p>
<p>通过<strong>度量学习</strong>,我们可以让模型更好地理解哪些特征是真正重要的,从而提高分类的准确性。</p>
<p>对于<strong>聚类任务</strong>,度量学习同样重要。</p>
<p>聚类是将数据点分成若干组,使得组内数据点相似度高,组间数据点相似度低。</p>
<p>一个合适的度量函数可以帮助我们更准确地划分这些组,例如在客户细分场景中,根据客户的消费行为、年龄等特征将客户分成不同的群体,以便进行精准营销。</p>
<h2 id="12-增强模型的泛化能力">1.2. 增强模型的泛化能力</h2>
<p>当我们在训练数据上学习到一个好的度量方式后,这个度量函数可以更好地泛化到新的数据上。</p>
<p>比如在一个图像检索系统中,我们训练了一个度量学习模型来衡量图片之间的相似性。</p>
<p>当有新的图片加入时,模型能够根据之前学到的度量方式准确地找到与之最相似的图片,而不会因为新图片的一些特殊特征而出现偏差。</p>
<h2 id="13-处理复杂数据结构">1.3. 处理复杂数据结构</h2>
<p>在现实世界中,数据往往具有复杂的结构。</p>
<p>例如,文本数据可以表示为词向量,但这些词向量之间的关系不仅仅是简单的欧几里得距离可以衡量的。</p>
<p><strong>度量学习</strong>可以帮助我们挖掘这些复杂数据结构中的内在联系,从而更好地处理各种复杂的数据类型。</p>
<h1 id="2-度量学习的实现">2. 度量学习的实现</h1>
<p>下面我们我们使用<code>scikit-learn</code>库中的内置的葡萄酒数据集,通过 <code>Neighborhood Components Analysis</code> (<code>NCA</code>) 算法演示度量学习。</p>
<pre><code class="language-python">from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neighbors import NeighborhoodComponentsAnalysis
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

# 加载数据并预处理
X, y = load_wine(return_X_y=True)
X = StandardScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 构建对比管道
vanilla_knn = Pipeline([('knn', KNeighborsClassifier(n_neighbors=3))])
metric_learning_knn = Pipeline([
    ('nca', NeighborhoodComponentsAnalysis(random_state=42)),
    ('knn', KNeighborsClassifier(n_neighbors=3))
])

# 训练与评估
vanilla_knn.fit(X_train, y_train)
metric_learning_knn.fit(X_train, y_train)

print(f"原始KNN准确率:{vanilla_knn.score(X_test, y_test):.2f}")
print(f"度量学习+KNN准确率:{metric_learning_knn.score(X_test, y_test):.2f}")

## 输出结果:
'''
原始KNN准确率:0.96
度量学习+KNN准确率:1.00
'''
</code></pre>
<p>加上<strong>度量学习</strong>,<code>KNN</code>的准确率得到了提高。</p>
<p>上面代码中的关键部分包括:</p>
<ol>
<li><strong>数据标准化</strong>:<code>StandardScaler</code>消除量纲差异,避免数值大的特征主导距离计算</li>
<li><strong>NCA转换</strong>:学习线性投影矩阵,将原始空间变换到优化后的特征空间</li>
<li><strong>流水线整合</strong>:将特征变换与分类器封装,保证训练/测试流程一致性</li>
</ol>
<h1 id="3-总结">3. 总结</h1>
<p><strong>度量学习</strong>是一种强大的机器学习技术,它通过学习合适的距离度量函数,帮助我们更好地处理和理解数据。</p>
<p>从传统的线性方法到基于深度学习的复杂模型,度量学习在分类、聚类、图像检索等众多领域都发挥着重要作用。</p>
<p>通过合理设计损失函数、选择网络架构和采样策略,我们可以实现更精准的度量学习模型,从而提升各种机器学习任务的效果。</p>
<p>通过让机器自主学习"数据世界的测量法则",<strong>度量学习</strong>为各类机器学习任务提供了更灵活的特征空间建模能力。</p>
<p>这种思想也启示我们:<strong>理解数据的内在关系,有时比堆砌复杂模型更重要</strong>。</p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/18899917
頁: [1]
查看完整版本: 度量学习:让机器学会“距离”的奥秘