Vector 如何将包含非数字特征的数据记录表示为向量(数学,而不是c+;+;向量)?

Vector 如何将包含非数字特征的数据记录表示为向量(数学,而不是c+;+;向量)?,vector,data-mining,Vector,Data Mining,许多数据挖掘算法/策略使用数据记录的向量表示来模拟数据的空间表示(如支持向量机) 我的问题来自如何在数据集中表示非数字特征。我的第一个想法是用1到n(其中n是功能的数量)的数字“别名”功能的每个可能值 在做一些研究时,我遇到了一个建议,即在处理具有少量可能值的功能时,应该使用长度为n的位字符串,其中每个位表示不同的值,并且只翻转与存储的值对应的一位。我可以看到,在理论上,使用这种方法可以节省内存,这些功能的可能值比用于在目标系统上存储整数值的位数要少,但我正在使用的数据集对于各种功能有许多不同的

许多数据挖掘算法/策略使用数据记录的向量表示来模拟数据的空间表示(如支持向量机)

我的问题来自如何在数据集中表示非数字特征。我的第一个想法是用1到n(其中n是功能的数量)的数字“别名”功能的每个可能值

在做一些研究时,我遇到了一个建议,即在处理具有少量可能值的功能时,应该使用长度为n的位字符串,其中每个位表示不同的值,并且只翻转与存储的值对应的一位。我可以看到,在理论上,使用这种方法可以节省内存,这些功能的可能值比用于在目标系统上存储整数值的位数要少,但我正在使用的数据集对于各种功能有许多不同的值,因此我认为该解决方案对我没有任何帮助


在向量中表示这些值的一些公认方法是什么?每种策略何时是最佳选择?

因此有一个惯例可以这样做。举例说明比解释容易得多

假设您已从web analytics应用程序中收集了四组描述每个网站访问者的指标:

  • 性别/性别

  • 采集通道

  • 论坛参与水平

  • 帐户类型

  • 其中每个变量都是一个分类变量(又称因子),而不是一个连续变量(例如,总会话时间或帐户年龄)

    对我来说,这种转换技术似乎比将每个变量保持为单个列更明智。例如,如果你选择后者,那么你必须将三种类型的采集通道与它们的数字表示相协调——也就是说,如果有机搜索是“1”,附属搜索应该是2,直接搜索应该是3,反之亦然

    这种表示法的另一个显著优点是,尽管有宽度扩展,但它是数据的紧凑表示法。(在列扩展很大的情况下——例如,一个字段是用户状态,这可能意味着一列变为50,稀疏矩阵表示显然是个好主意。)

    对于这类工作,我使用数值计算库NumPy和SciPy

    从Python交互式提示符:

    >>> # 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应用程序中收集了四组描述每个网站访问者的指标:

  • 性别/性别

  • 采集通道

  • 论坛参与水平

  • 帐户类型

  • 其中每个变量都是一个分类变量(又称因子),而不是一个连续变量(例如,总会话时间或帐户年龄)

    对我来说,这种转换技术似乎比将每个变量保持为单个列更明智。例如,如果你选择后者,那么你必须将三种类型的采集通道与它们的数字表示相协调——也就是说,如果有机搜索是“1”,附属搜索应该是2,直接搜索应该是3,反之亦然

    这种表示法的另一个显著优点是,尽管有宽度扩展,但它是数据的紧凑表示法。(在列扩展很大的情况下——例如,一个字段是用户状态,这可能意味着一列变为50,稀疏矩阵表示显然是个好主意。)

    对于这类工作,我使用数值计算库NumPy和SciPy

    从Python交互式提示符:

    >>> # 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、
      long double
      或您的语言使用的任何类型。然后写函数t