分类数据的矢量量化

时间:2014-12-29 19:44:09

标签: python cluster-analysis

矢量量化软件通常只适用于数值数据。其中一个例子是Python的scipy.cluster.vq.vqhere),它执行矢量量化。数值数据要求也出现在大多数群集软件中。

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

显而易见的替代方案是改变距离函数。对于混合数据类型,从观察到"中心的距离"或者"代码簿条目"可以表示为两部分总和,包括(a)数值变量的通常欧几里得计算和(b)分类变量的不等式指标的总和,如第125页的建议here

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

2 个答案:

答案 0 :(得分:1)

你无法量化"分类数据。

召回量化的{em>定义(Wiktionary):

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

换句话说,量化意味着连续变量转换为离散变量。对于多个变量,矢量量化也是一样的。

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

你似乎在寻找的是基于原型的分类数据聚类算法(也许是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))

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

更难的部分通常是构建代码簿,而不是使用它。

答案 1 :(得分:1)

对于机器学习和聚类算法,您还可以找到有用的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=可以是字符串(带有标识符)一个已经实现的distance functions)或一个可调用的python函数,它将以成对的方式计算距离。

如果找不到所需的指标,可以随时将其编程为python函数:

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

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

同一个库中还有其他一些聚类算法,请查看它们here