如何找到混合连续和分类数据的相似度/距离矩阵?

数据挖掘 相似 余弦距离
2021-10-03 13:47:52

假设我有一个这样的数据集:

Hotel  HasPool AvgPrice
 1        1      $123
 2        0      $234 
 3        1      $200     

目前我已将数据集分解为 2 个(一个包含所有连续的,其他所有分类的)。连续的,我计算欧几里得距离 b/w 所有观察,而对于分类的,我计算余弦距离。有没有办法有效地结合两个分数。或者,是否有适用于两种数据类型的距离函数?我的最终输出应如下所示:

Hotel  1   2   3
  1    1  0.3  0.7 
  2    0.3  1  0.5 
  3    0.7  0.5 1

任何帮助将不胜感激!谢谢

4个回答

相似性度量是主观的,它们的组合方式也是如此。你应该决定你对相似性的主观定义是什么,然后找到一种方法来组合它们以符合你的定义。

一般来说,我喜欢将相似性问题简化为分类问题。给定您拥有的项目数据集,创建一个新的项目对数据集。概念应该是一对中的两个项目是否相似。您拥有的每个相似性度量都是该对的一个特征。请注意,现在您处于良好的旧分类框架中。您可以通过计算给定概念的互信息/准确性/您选择的指标来评估相似性度量。

在您的情况下,我会以这种方式构建数据集。首先选择你的两个措施都同意的成对的项目。选择欧几里得距离和余弦距离都接近的对或两种度量都远的对。请注意,由于相似性度量在这些对上达成一致,因此将它们组合起来通常也会导致一致,但并不那么重要。但是,您应该使用这样的对,这样它们才能稳定您的加权函数。除此之外,您可以轻松生成这些对,这始终是一个优势。

接下来,您应该选择您的相似性函数不同意的对。选择一些被认为靠近第一个而被第二个认为远的,反之亦然。手动标记这些对以确定它们是否接近。

构建数据集后,您可以将您对相似性的主观定义呈现为一组对和距离。现在运行任何分类器(在您的情况下,线性回归可能适合您寻找的内容)并将结果用作组合相似性度量。

首先,我不想做余弦相似度,而是希望您看看一些分类数据存在的相似度度量,例如 Eskin、IOF、OF、Lin、Lin1、Goodall1、2、3、4,等等。

由于您正在使用 python,我对您的建议是导入名为 Categorical_similarity_measures 的库并构造数据的邻近矩阵,然后使用层次聚类分析 (HCA) 进行聚类

查看该库的链接:https ://pypi.org/project/Categorical-similarity-measures/0.4/

为了结合余弦距离和欧几里德距离,我首先将欧几里德距离标准化为与余弦距离 [o-1] 相同的尺度,然后将它们平均组合。但我相信你已经尝试过这种方法。因此,我想知道您对“有效结合两个分数”的定义是什么?您是否需要对这两个指标进行不同的加权?您是如何得出要展示的最终矩阵的?是直觉吗?如果是这样,您可以对此进行进一步调查,以更好地定义您希望赋予每个功能及其相关指标的权重。

当数据为混合类型时,您可以使用高尔距离来获得相似度矩阵。此功能在 R 包中实现clusterCluMix并且FD.

在 cluster 包中,这是在 function 中实现的daisy一个示例用途是,

 diss_mat <- daisy(data, metric = "gower")

其中的列data包含变量。您必须为变量分配正确的类型(数字、因子或有序因子)。