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