Vector 如何将包含非数字特征的数据记录表示为向量(数学,而不是c+;+;向量)?
许多数据挖掘算法/策略使用数据记录的向量表示来模拟数据的空间表示(如支持向量机) 我的问题来自如何在数据集中表示非数字特征。我的第一个想法是用1到n(其中n是功能的数量)的数字“别名”功能的每个可能值 在做一些研究时,我遇到了一个建议,即在处理具有少量可能值的功能时,应该使用长度为n的位字符串,其中每个位表示不同的值,并且只翻转与存储的值对应的一位。我可以看到,在理论上,使用这种方法可以节省内存,这些功能的可能值比用于在目标系统上存储整数值的位数要少,但我正在使用的数据集对于各种功能有许多不同的值,因此我认为该解决方案对我没有任何帮助Vector 如何将包含非数字特征的数据记录表示为向量(数学,而不是c+;+;向量)?,vector,data-mining,Vector,Data Mining,许多数据挖掘算法/策略使用数据记录的向量表示来模拟数据的空间表示(如支持向量机) 我的问题来自如何在数据集中表示非数字特征。我的第一个想法是用1到n(其中n是功能的数量)的数字“别名”功能的每个可能值 在做一些研究时,我遇到了一个建议,即在处理具有少量可能值的功能时,应该使用长度为n的位字符串,其中每个位表示不同的值,并且只翻转与存储的值对应的一位。我可以看到,在理论上,使用这种方法可以节省内存,这些功能的可能值比用于在目标系统上存储整数值的位数要少,但我正在使用的数据集对于各种功能有许多不同的
在向量中表示这些值的一些公认方法是什么?每种策略何时是最佳选择?因此有一个惯例可以这样做。举例说明比解释容易得多 假设您已从web analytics应用程序中收集了四组描述每个网站访问者的指标:
>>> # create two data rows, representing two unique visitors to a Web site:
>>> row1 = NP.array([0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0])
>>> row2 = NP.array([1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0])
>>> row1.dtype
dtype('int64')
>>> row1.itemsize
8
>>> # these two data arrays can be converted from int/float to boolean, substantially
>>> # reducing their size w/ concomitant performance improvement
>>> row1 = NP.array(row1, dtype=bool)
>>> row2 = NP.array(row2, dtype=bool)
>>> row1.dtype
dtype('bool')
>>> row1.itemsize # compare with row1.itemsize = 8, above
1
>>> # element-wise comparison of two data vectors (two users) is straightforward:
>>> row1 == row2 # element-wise comparison
array([False, False, False, False, True, True, False, True, True, False], dtype=bool)
>>> NP.sum(row1==row2)
5
对于基于相似性的计算(例如k-最近邻),有一个特定的度量用于由分类变量组成的扩展数据向量,称为Tanimoto系数。对于我在这里使用的特定表示,函数如下所示:
def tanimoto_bool(A, B) :
AuB = NP.sum(A==B)
numer = AuB
denom = len(A) + len(B) - AuB
return numer/float(denom)
>>> tanimoto_bool(row1, row2)
0.25
所以这是一个惯例。举例说明比解释容易得多 假设您已从web analytics应用程序中收集了四组描述每个网站访问者的指标:
>>> # create two data rows, representing two unique visitors to a Web site:
>>> row1 = NP.array([0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0])
>>> row2 = NP.array([1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0])
>>> row1.dtype
dtype('int64')
>>> row1.itemsize
8
>>> # these two data arrays can be converted from int/float to boolean, substantially
>>> # reducing their size w/ concomitant performance improvement
>>> row1 = NP.array(row1, dtype=bool)
>>> row2 = NP.array(row2, dtype=bool)
>>> row1.dtype
dtype('bool')
>>> row1.itemsize # compare with row1.itemsize = 8, above
1
>>> # element-wise comparison of two data vectors (two users) is straightforward:
>>> row1 == row2 # element-wise comparison
array([False, False, False, False, True, True, False, True, True, False], dtype=bool)
>>> NP.sum(row1==row2)
5
对于基于相似性的计算(例如k-最近邻),有一个特定的度量用于由分类变量组成的扩展数据向量,称为Tanimoto系数。对于我在这里使用的特定表示,函数如下所示:
def tanimoto_bool(A, B) :
AuB = NP.sum(A==B)
numer = AuB
denom = len(A) + len(B) - AuB
return numer/float(denom)
>>> tanimoto_bool(row1, row2)
0.25
据我所知,没有“被广泛接受的答案”,这完全取决于你想要什么
文章背后的主要思想是,状态的琐碎内存表示可能过于内存密集。例如,要存储最多可以有四种状态的值,您将使用int
(32位),但您可以仅使用2位来管理,因此可以减少16倍
然而,向量的表示越巧妙(即:紧凑),从平凡的表示编码/解码它所需的时间就越长
我做了一个项目,我用2个双精度(64位)来表示一个板的状态,每个双精度编码每个播放器拥有的光盘。与将状态存储为42个整数相比,这是一个巨大的改进!我可以用更小的内存来探索更远的地方。这通常是您想要的
通过对Connect-4的巧妙理解,只需一个double就可以对其进行编码!我试过了,程序变得很长,我恢复使用两个双打而不是一个。该程序的大部分时间用于编码/解码功能。这通常是您不想要的
现在,因为您需要答案,这里有一些指导原则:
- 如果只能存储一个字节的布尔值,则将其保留为布尔值(取决于语言/编译器)
- 将所有小功能(3到256个可能的值)串联在基本类型中,如
、int
double、
或您的语言使用的任何类型。然后写函数tlong double