【问题标题】:Vector quantization for categorical data分类数据的矢量量化
【发布时间】:2015-02-26 00:01:38
【问题描述】:

矢量量化软件通常仅适用于数值数据。一个例子是 Python 的 scipy.cluster.vq.vq (here),它执行矢量量化。大多数聚类软件也存在数值数据要求。

许多人指出,您始终可以将分类变量转换为一组二进制数值变量。但是,在处理单个分类变量可能有数百或数千个类别的大数据时,这会变得很尴尬。

显而易见的替代方法是更改​​距离函数。对于混合数据类型,从观测到“中心”或“码本条目”的距离可以表示为两部分总和,包括 (a) 数值变量的常用欧几里德计算和 (b) 不等式指标的总和对于分类变量,如第 125 页上的 here 建议的那样。

是否有任何具有这种广义距离函数的矢量量化开源软件实现?

【问题讨论】:

  • 虽然可以使用大量现有代码来解决这类问题(正如您所指出的),但我的经验是,距离函数几乎总是必须专门编写以适应特定数据问题。

标签: python cluster-analysis


【解决方案1】:

您不能“量化”分类数据。

回忆量化的定义 (Wiktionary):

  1. 通过应用量子力学规则来限制一个量或系统状态的可能值的数量
  2. 用幅度只能有一组离散值的信号来近似连续变化信号

换句话说,量化意味着连续变量转换为离散变量。矢量量化同样适用于多个变量。

但是,类别变量已经是离散的

您似乎正在寻找一种基于原型的分类数据聚类算法(可能是 STING 和 COOLCAT?我不知道他们是否会产生原型);但这不再是“矢量量化”了。

我相信很多时候,频繁项集挖掘实际上是寻找分类数据原型/原型的最佳方法。

至于允许其他距离函数的聚类算法 - 有很多。 ELKI有很多这样的算法,还有一个tutorial on implementing a custom distance。但这是 Java,而不是 Python。我很确定至少 一些 scipy 中的聚类算法也允许自定义距离。

现在 pythons scipy.cluster.vq.vq真的简单的代码。你根本不需要图书馆。这个函数的主要工作是包装一个运行速度比python代码快得多的C实现......如果你看py_vq版本(当C版本不能使用时使用),真的是很简单的代码...... . 本质上,对于每个对象obs[i],它都会调用这个函数:

code[i] = argmin(np.sum((obs[i] - code_book) ** 2, 1))

现在您显然不能将欧几里得距离与分类码本一起使用;但是将这条线翻译成您想要的任何相似性并不难。

较难的部分通常是构建码本,而不是使用它。

【讨论】:

  • 我完全同意我滥用了“量化”这个词。我可能开始以这种方式思考,因为我正在寻找 scipy.cluster.vq.vq 量化算法实现的轻微扩展/概括。
  • scipy.cluster.vq.vq只是码本的应用;一旦你定义了相似性,这对你自己来说是微不足道的。更难的部分通常是构建密码本......
  • 是的,我想做的在概念上非常简单。在这种情况下,我需要经过优化的代码来处理大数据。是时候让 Cython 和/或 C 变得更舒服了。
【解决方案2】:

对于机器学习和聚类算法,您还可以找到有用的scikit-learn。为了实现你想要的,你可以看看他们对DBSCAN的实现。

在他们的文档中,您可以找到:

sklearn.cluster.dbscan(X, eps=0.5, min_samples=5, metric='minkowski', algorithm='auto', leaf_size=30, p=2, random_state=None)

这里的X 可以是您已经计算的距离矩阵(并传递metric='precomputed')或标准的samples x features 矩阵,而metric= 可以是一个字符串(带有已实现@987654323 之一的标识符@) 或一个可调用的 python 函数,它将以成对的方式计算距离。

如果你找不到你想要的指标,你总是可以将它编程为一个 python 函数:

def mydist(a, b):
    return a - b # the metric you want comes here

然后用metric=mydist 调用dbscan。或者,您可以预先计算距离矩阵,并将其传递给聚类算法。

同一个库中还有一些其他的聚类算法,看看here

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多