矢量量化软件通常只在数值数据上工作。Python的scipy.cluster.vq.vq (here)就是一个这样的例子,它执行矢量量化。对于大多数集群软件来说,数字数据的需求也很明显。
许多人指出,您总是可以将分类变量转换为一组二进制数值变量。但在处理大数据时,这会变得很尴尬,因为在大数据中,单个分类变量可能有数百或数千个类别。
另一种明显的选择是改变距离函数。对于混合数据类型,从观察值到“中心”或“码本条目”的距离可以表示为两部分总和,涉及(a)数值变量的通常欧几里德计算和(b)分类变量的不等式指标总和,如125页上建议的here所示。
有没有使用这种广义距离函数的矢量量化的开源软件实现?
发布于 2015-01-02 20:14:10
你不能“量化”类别数据。
回顾量化的定义(Wiktionary):
换句话说,量化意味着将连续变量转换为离散变量。矢量量化可以同时对多个变量执行同样的操作。
然而,类别变量已经离散化了,是离散的。
您似乎正在寻找一种针对类别数据的基于原型的聚类算法(可能是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))现在,您显然不能将欧几里德距离与类别代码簿一起使用;但将这一行转换为您想要的任何相似性并不困难。
更难的部分通常是构建码本,而不是使用它。
发布于 2015-01-02 21:52:33
对于机器学习和聚类算法,您还可以找到有用的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并使用metric=mydist调用dbscan。或者,您可以先计算距离矩阵,然后将其传递给聚类算法。
在同一个库中还有一些其他的聚类算法,看看它们的here。
https://stackoverflow.com/questions/27694998
复制相似问题