奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解,是矩阵分析中正规矩阵求对角化的推广。在信号处理、统计学等领域有重要应用。

背景信息

奇异值分解的公式为X = U S V’

参数配置

PAI-Studio支持通过可视化或PAI命令的方式,配置该组件参数,如下所示:
  • 可视化方式
    页签 参数 描述
    字段设置 选择特征列 存放k:v,k:v格式的列。
    参数设置 保留奇异值个数 期望求解的top奇异组个数。默认求解全部奇异组。
    精度误差 允许的期望的误差精度。
    执行调优 单个节点内存大小 单位为兆,与节点个数参数配对使用,取值为[1, 9999]的正整数。
    节点个数 取值为[1024, 64*1024]的正整数。
    生命周期 指定输出表的生命周期。
  • PAI命令方式
    PAI -name svd
        -project algo_public
        -DinputTableName=bank_data
        -DselectedColNames=col0
        -DenableSparse=true
        -Dk=5
        -DoutputUTableName=u_table
        -DoutputVTableName=v_table
        -DoutputSTableName=s_table;
    参数名称 是否必选 参数描述 默认值
    inputTableName 进行主成分分析的输入表。
    selectedColNames 输入表中用于分析的列名称,使用逗号分隔。

    如果是稀疏矩阵,支持STRING类型。如果是表,支持INT和DOUBLE类型。

    默认选择所有列。
    inputTablePartitions 输入表中指定参与分析的分区,格式为Partition_name=value

    如果是多级分区,格式为name1=value1/name2=value2,

    如果指定多个分区,则需要使用,隔开。

    默认选择所有分区。
    outputUTableName U矩阵的输出表,维度是m * sgNum。其中,m为数据表的行数,sgNum为计算出的奇异值个数。
    outputSTableName S矩阵的输出表,维度是sgNum * sgNum。其中,sgNum为计算出的奇异值个数。
    outputVTableName V矩阵的输出表,维度是n * sgNum。其中,n是矩阵的列数,sgNum是计算出的奇异值个数。
    k 期望的奇异值个数。

    输出的结果为可能比K值小的正整数。

    tol 收敛误差 1.0e~06
    enableSparse 输入数据是否为稀疏格式:
    • true
    • false
    false
    itemDelimiter 指当输入表数据为稀疏格式时,kv间的分隔符。 空格
    kvDelimiter 指当输入表数据为稀疏格式时,key和value的分隔符。 冒号
    coreNum 节点个数。与memSizePerCore参数配对使用,取值为[1, 9999]的正整数。 系统自动分配。
    memSizePerCore 单个节点内存大小,单位为兆。取值为[1024, 64*1024]的正整数。 系统自动分配。
    lifecycle 指定输出表的生命周期。取值为正整数。

示例

  • 数据生成
    drop table if exists svd_test_input;
    create table svd_test_input
    as
    select
        *
    from
    (
      select
            '0:3.9079 2:0.0009 3:0.0416 4:0.17664 6:0.36460 8:0.091330' as col0
        from dual
        union all
      select
            '0:0.09229 2:0.4872172 5:0.5267 8:0.4544 9:0.23317' as col0
        from dual
        union all
        select
        '1:0.8312 3:0.9317 5:0.5680 7:0.5560 9:0.0508' as col0
        from dual
        union all
        select
        '2:0.767 5:0.01891 8:0.25235 ' as col0
        from dual
        union all
        select
        '0:0.29819 2:0.87598086 6:0.5315568 ' as col0
        from dual
        union all
        select
        '0:0.920260 2:0.5154311513 4:0.8104 5:0.188420 8:0.88' as col0
        from dual
    ) a;
  • PAI命令
    PAI -name svd
        -project algo_public
        -DinputTableName=svd_test_input
        -DselectedColNames=col0
        -DenableSparse=true
        -Dk=5
        -DoutputUTableName=u_table
        -DoutputVTableName=v_table
        -DoutputSTableName=s_table;
  • 算法规模:10万列。