1. 创建人工相似性度量

要计算两个示例之间的相似度,您需要将这两个示例的所有特征数据组合为一个数值。

1.1 人工相似性度量

例如,考虑仅具有一个特征的鞋子数据集:鞋子大小。 可以通过计算两双鞋子之间的差异来量化两双鞋子的相似程度。尺寸之间的数值差异越小,鞋子之间的相似性就越大。这种人工创建的相似性度量称为人工相似性度量(Manual Similarity Measure)。

如果想要找出鞋子尺码和颜色之间的相似性呢?颜色是类别(离散)数据(categorical data),并且它非常难以与数值型数据结合。随着数据变得更加复杂,创建人工相似性度量变得更难。当你的数据变得足够复杂时,将不能创建人工相似性度量。这时应该转变思路,使用监督的相似性度量,即使用监督学习的模型来计算相似性。

我们将留有监督的相似性度量以供以后使用,而在这里着重介绍手动度量。请记住,当无法创建人工相似性度量时,应该切换到监督相似性度量。

为了了解人工相似度测量的工作原理,让我们看一下鞋子的例子。假设模型具有两个特征:鞋号和鞋价数据。由于这两个特征都是数字,因此可以将它们组合为一个表示相似性的数字,如下所示。

  • Size(s):鞋码可能符合高斯分布。确认这一点,然后规范化数据。
  • Price (p):数据可能是泊松分布。确认这一点,如果有足够的数据,将数据转换为分位数并缩放到 [ 0 , 1 ] [0,1] [0,1]
  • 通过使用均方根误差(RMSE)合并数据。在这里,相似度的衡量公式为 s 2 + p 2 2 \sqrt{\frac{s^2+p^2}{2}} 2s2+p2

举一个简单的例子,计算两双美国尺码8和11以及价格分别为120和150的鞋子计算相似度。由于没有足够的数据来了解分布,因此只需要对数据进行缩放就可以不进行标准化或使用分位数。

【数据挖掘 17】聚类算法03:创建相似性度量
直觉上,当特征数据变得相似时,相似度应增加。相反,相似度应该降低。从1减去计算得到的RMSE,使测得的相似度遵循直觉。

S i m i l a r i t y = 1 − 0.17 = 0.83 Similarity = 1- 0.17 = 0.83 Similarity=10.17=0.83

通常,可以准备数字数据,然后使用欧几里得距离来组合数据。

如果特征中包含分类数据,可以作如下处理:

  • 单值(单值),例如汽车的颜色(“白色”或“蓝色”,但不能同时包含两者);
  • 多值(多值),例如电影的类型(可以同时是“动作”和“喜剧”,也可以只是“动作”);

如果单值数据匹配,则相似度为1,否则为0。多值数据更难处理。例如,电影类型可能是一个挑战。为了解决这个问题,假设电影是从固定的一组流中分配的流。使用共同值的比率来计算相似度,称为Jaccard相似度(Jaccard similarity)。

Examples:
【数据挖掘 17】聚类算法03:创建相似性度量
下表提供了更多有关如何处理分类数据的示例。

Examples
Postal code 代表彼此接近的区域的邮政编码应具有更高的相似性。要对准确计算相似度所需的信息进行编码,可以将邮政编码转换为纬度和经度。对于一对邮政编码,请分别计算其纬度和经度之差。然后将差值相加以获得单个数值。
Color 假设有颜色数据作为文本,将文本值转换为数字RGB值。现在,可以找到两种颜色的红色,绿色和蓝色值之间的差异,并使用欧几里德距离将差异组合为数值。

通常,相似性度量必须直接对应于实际相似性。如果指标不正确,则说明该指标未编码必要的信息。前面的示例将邮政编码转换为纬度和经度,因为邮政编码本身没有对必要的信息进行编码。

1.2 练习

第一步是预处理数字特征:价格,大小,卧室数和邮政编码。 对于这些特征,必须执行不同的操作。

Q1:例如,假设定价数据遵循双峰分布。接下来该怎么办?
A1:从数据创建分位数并缩放至[0,1]。

Q2:尝试说明如何处理尺寸数据。
A2:检查尺寸是否遵循幂律,泊松或高斯分布。

  • Power-law: Log transform and scale to [0,1].
  • Poisson: Create quantiles and scale to [0,1].
  • Gaussian: Normalize and scale to [0,1].

Q3:尝试说明如何处理卧室数量数据。
A3:检查分配的卧室数。最有可能的是,将异常值剪裁并缩放到[0,1]就足够了,但是如果您发现幂律分布,则可能需要对数转换。应该如何代表邮政编码?将邮政编码转换为经度和纬度。然后像处理其他数值一样处理这些值。


如果要计算每个特征的相似度。对于数字特征,只需找到差异即可。对于二元特征(例如,如果房子有车库),也可以找到差值以得到0或1,但是分类特征呢?

Q1:以下哪个特征是多值的(可以有多个值)?
A1:颜色。给定的住所可以有多种颜色,例如蓝色和白色装饰。因此,颜色是多价特征。

Q2:应使用哪种类型的相似性度量来计算多值特征的相似性?

Jaccard相似度。假设为房屋分配了一组固定的颜色。然后,使用公共值的比率(Jaccard相似度)计算相似度。

1.3 计算整体相似度

您已经通过数值计算了每个特征的相似度。但是,聚类算法要求计算簇之间的总体相似性。通过使用均方根误差(RMSE)组合每个特征相似度,计算一对簇之间的总体相似度。也就是说:
R M S E = s 1 2 + s 2 2 + . . . + s N 2 N RMSE=\sqrt{\frac{s^2_1+s^2_2+...+s^2_N}{N}} RMSE=Ns12+s22+...+sN2
其中 s 1 , s 2 , … , s N s_1,s_2,…,s_N s1,s2,,sN 代表 N N N 个特征的相似性。

1.4 人工相似性度量的局限性

如本练习所示,当数据变得复杂时,越来越难以处理和组合数据以语义上有意义的方式准确地测量相似性。考虑颜色数据,颜色真的应该是绝对的吗?还是应该指定红色和栗色之类的颜色比黑色和白色具有更高的相似性?关于合并数据,我们仅将车库特征与房屋价格加权平均。但是,房价远比拥有车库重要。同等程度的权衡真的有意义吗?

如果创建的相似性度量不能真正反映出示例之间的相似性,那么派生的聚类将毫无意义。分类数据通常是这种情况,这使我们处于监督之下。


2. 监督的相似性度量

可以将特征数据简化为称为嵌入(embeddings)的表示形式,然后再比较嵌入,而不是比较手动组合的特征数据。通过在特征数据本身上训练有监督的深度神经网络(DNN)来生成嵌入。 嵌入将特征数据映射到嵌入空间中的向量。 通常,以捕获特征数据集的某些潜在结构的方式,嵌入空间的维数少于特征数据。相似示例的嵌入向量(例如,同一用户观看的YouTube视频)最终在嵌入空间中靠得很近。

请记住,我们在讨论有监督的学习,只是为了建立相似性度量。然后,算法使用相似性度量(无论是手动还是有监督)来执行无监督聚类。

2.1 人工和监督的比较

下表描述了根据需求何时使用手动或监督的相似性度量。

【数据挖掘 17】聚类算法03:创建相似性度量

2.2 监督相似性度量的过程

下图显示了如何创建有监督的相似性度量:
【数据挖掘 17】聚类算法03:创建相似性度量

2.3 根据训练标签选择DNN

通过训练使用相同特征数据作为输入和标签的DNN,将特征数据减少为嵌入。例如,对于房屋数据,DNN将使用这些特征(例如价格,大小和邮政编码)来预测这些特征本身。为了使用特征数据预测相同的特征数据,DNN被迫将输入特征数据减少为嵌入。可以使用这些嵌入来计算相似度。

通过预测输入数据本身来学习输入数据嵌入的DNN称为自动编码器(Autoencoder)。由于自动编码器的隐藏层小于输入和输出层,因此自动编码器被迫学习输入特征数据的压缩表示形式。训练DNN后,将从最后一个隐藏层中提取嵌入内容以计算相似度。
【数据挖掘 17】聚类算法03:创建相似性度量
自动编码器是生成嵌入的最简单选择。但是,当某些特征在确定相似性方面比其他特征更重要时,自动编码器不是最佳选择。例如,在房屋数据中,假设“价格”比“邮政编码”重要,在这种情况下,仅将重要特征用作DNN的训练标签,因为该DNN会预测特定的输入特征,而不是预测所有输入特征,它被称为 predictor DNN。请按照以下准则选择特征作为标签:

  • 优先使用数字特征而不是分类特征作为标签,因为对于数字特征而言,损失更易于计算和解释。
  • 不要使用基数为≲100的分类特征作为标签。如果这样做,DNN将不会被迫将输入数据减少为嵌入,因为DNN可以轻松预测低基数的分类标签。
  • 从DNN的输入中删除用作标签的特征;否则,DNN会完美预测。

根据您选择的标签,生成的DNN是自动编码器DNN或预测器DNN。

2.4 DNN的损失函数

要训​​练DNN,您需要按照以下步骤创建损失函数:

  • 计算DNN的每个输出的损失。对于以下输出:

    • 数值,请使用均方误差(MSE)。
    • 单值类别(Univalent categorical),使用对数损失。无需自己实现对数丢失,可以使用库函数来计算它。
    • 多值类别(Multivalent categorical),使用softmax交叉熵损失。无需自己实现softmax交叉熵损失,可以使用库函数来计算它。
  • 通过将每个输出的损失相加来计算总损失。

在对损失进行求和时,请确保每个特征均按比例贡献了损失。 例如,如果将颜色数据转换为RGB值,则有三个输出。 但是,将三个输出的损失相加就意味着色彩损失的权重是其他特征的三倍。 而应该将每个输出乘以1/3。

2.5 在在线系统中使用DNN

在线机器学习系统具有连续的新输入数据流,需要在新数据上训练DNN。但是,如果从头开始重新训练DNN,则嵌入会有所不同,因为DNN是使用随机权重初始化的。相反,应该始终使用现有权重热启动DNN,然后使用新数据更新DNN。


3. 生成嵌入示例

此示例说明如何生成在监督相似性度量中使用的嵌入。

想象一下,有与创建手动相似性度量时相同的住房数据集:

【数据挖掘 17】聚类算法03:创建相似性度量

3.1 预处理数据

在使用特征数据作为输入之前,需要预处理数据。预处理步骤基于创建手动相似性度量时所采取的步骤。总结如下:

【数据挖掘 17】聚类算法03:创建相似性度量

3.2 选择预测器或自动编码器

要生成嵌入,可以选择自动编码器(autoencoder)或预测器(predictor)。 请记住,默认选择是自动编码器。如果数据集中的特定特征决定相似性,则选择预测器。为了完整起见,让我们看看这两种情况。

3.2.1 Train a Predictor

您需要选择那些特征作为DNN的训练标签,这对于确定示例之间的相似性很重要。假设价格对于确定房屋之间的相似性最为重要。

选择价格作为训练标签,并将其从输入特征数据中删除,然后输入到DNN。通过使用所有其他特征作为输入数据来训练DNN。对于训练,损失函数只是预测价格与实际价格之间的MSE。

3.2.2 Train an Autoencoder

在数据集上训练自动编码器,遵循以下步骤:

  • 确保自动编码器的隐藏层小于输入和输出层。
  • 如监督相似性度量中所述计算每个输出的损失。
  • 通过将每个输出的损失相加来创建损失函数。确保为每个特征均等地权衡损失。例如,因为将颜色数据处理为RGB,所以将每个RGB输出加权1/3。

3.3 从DNN中提取嵌入

训练完DNN(预测器或自动编码器)后,从DNN中提取示例的嵌入。使用示例的特征数据作为输入来提取嵌入,并读取最终隐藏层的输出,这些输出形成嵌入向量。类似簇的向量应比不同簇的向量靠得更近。

3.4 从嵌入中衡量相似性

现在,可以对任何一对示例进行嵌入。相似性度量采用这些嵌入,并返回一个度量其相似性的数字。嵌入只是数字的向量。要找到两个向量 A = [ a 1 , a 2 , . . . , a n ] A=[a_1,a_2,...,a_n] A=[a1,a2,...,an] B = [ b 1 , b 2 , . . . , b n ] B=[b_1,b_2,...,b_n] B=[b1,b2,...,bn] 之间的相似性,可以选择三种相似性度量,如下表所示 。
【数据挖掘 17】聚类算法03:创建相似性度量
选择相似性度量

与余弦相反,点积与向量长度成正比。这很重要,因为在训练集中经常出现的示例(例如,流行的YouTube视频)往往具有较大的嵌入向量。如果要吸引人气,请选择点积。但是,风险是流行的示例可能会歪曲相似性指标。为了平衡这种歪斜(skewed),可以将长度增加到指数 α < 1 α<1 α<1,以将点积计算为 ∣ a ∣ α ∣ b ∣ α c o s ⁡ ( θ ) |a|^α|b|^α cos⁡(θ) aαbαcos(θ)

为了更好地了解向量长度如何改变相似性度量,可以将向量长度归一化为1并注意这三个度量变得彼此成比例。

【数据挖掘 17】聚类算法03:创建相似性度量

总结

总而言之,相似性度量量化了一对示例之间相对于其他示例对的相似性。下表比较了两种相似性度量:

【数据挖掘 17】聚类算法03:创建相似性度量


参考:
https://developers.google.com/machine-learning/clustering/similarity/manual-similarity

相关文章: