矢量量化软件通常只适用于数值数据。其中一个例子是Python的scipy.cluster.vq.vq
(here),它执行矢量量化。数值数据要求也出现在大多数群集软件中。
许多人指出,您始终可以将分类变量转换为一组二进制数值变量。但是,在使用大数据时,这会变得很尴尬,其中单个分类变量可能有数百或数千个类别。
显而易见的替代方案是改变距离函数。对于混合数据类型,从观察到"中心的距离"或者"代码簿条目"可以表示为两部分总和,包括(a)数值变量的通常欧几里得计算和(b)分类变量的不等式指标的总和,如第125页的建议here。
是否存在具有这种广义距离函数的矢量量化的开源软件实现?
答案 0 :(得分:1)
你无法量化"分类数据。
召回量化的{em>定义(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))
现在你显然不能将欧几里德距离与分类码本一起使用;但是将这一行翻译成你想要的任何相似性并不难。
更难的部分通常是构建代码簿,而不是使用它。
答案 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。