Python 分类数据的矢量量化

Python 分类数据的矢量量化,python,cluster-analysis,Python,Cluster Analysis,矢量量化软件通常只对数值数据起作用。Python的scipy.cluster.vq.vq()就是一个例子,它执行矢量量化。数字数据需求也适用于大多数集群软件 许多人指出,您总是可以将一个分类变量转换为一组二进制数值变量。但是,在处理大数据时,如果单个类别变量可能有数百或数千个类别,那么这将变得很尴尬 明显的替代方法是更改距离函数。对于混合数据类型,从观测到“中心”或“码本条目”的距离可以表示为两部分之和,包括(a)数值变量的常规欧氏计算和(b)分类变量的不平等指标之和,如第125页所述 有没有开

矢量量化软件通常只对数值数据起作用。Python的
scipy.cluster.vq.vq
()就是一个例子,它执行矢量量化。数字数据需求也适用于大多数集群软件

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

明显的替代方法是更改距离函数。对于混合数据类型,从观测到“中心”或“码本条目”的距离可以表示为两部分之和,包括(a)数值变量的常规欧氏计算和(b)分类变量的不平等指标之和,如第125页所述

有没有开源的软件实现这种广义距离函数的矢量量化

您不能“量化”分类数据

回忆量化()的定义:

  • 通过应用量子力学的规则来限制一个量或系统状态的可能值的数量
  • 用振幅只能有一组离散值的信号近似连续变化的信号
  • 换句话说,量化意味着将连续变量转换为离散变量。矢量量化对多个变量同时执行相同的操作

    然而,分类变量已经是离散的

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

    我相信,频繁项集挖掘实际上是找到分类数据原型/原型的最佳方法

    至于允许使用其他距离函数的聚类算法,还有很多。有很多这样的算法,也有很多。但这是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))
    
    def mydist(a, b):
        return a - b # the metric you want comes here
    
    很明显,你不能用欧几里德距离作为分类码本;但将这句话翻译成你想要的任何相似之处并不难


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

    对于机器学习和聚类算法,您也会发现有用的。为了实现你想要的,你可以看看它们的实现

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

    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=
    可以是一个字符串(带有已实现的其中一个的标识符)或者一个可调用的python函数,它将以成对方式计算距离

    如果找不到所需的度量,则始终可以将其编程为python函数:

    code[i] = argmin(np.sum((obs[i] - code_book) ** 2, 1))
    
    def mydist(a, b):
        return a - b # the metric you want comes here
    
    并使用
    metric=mydist
    调用
    dbscan
    。或者,您可以先计算距离矩阵,然后将其传递给聚类算法


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

    虽然可以使用大量现有代码来解决这类问题(如您所述),但我的经验是,距离函数几乎总是必须专门编写,以适应特定问题中的数据。我完全同意我滥用了这个词“量化“。我可能开始这样想,因为我正在寻找对
    scipy.cluster.vq.vq
    量化算法实现的一个小小的扩展/概括。
    scipy.cluster.vq.vq
    只是一个代码本的应用;一旦你定义了相似性,你自己做这件事就相当简单了。最困难的部分通常是构建代码本…是的,我试图做的是非常简单的概念。在这种情况下,我需要经过良好优化的代码来处理大数据。是时候让Cython和/或C更舒适了。