matlab - 使用多变量多项式的特征映射

标签 matlab machine-learning mapping octave linear-regression

假设我们有一个数据矩阵 数据点 我们有兴趣将这些数据点映射到更高维的特征空间。我们可以通过使用 d 次多项式来做到这一点。因此对于 的序列新数据矩阵的数据点是

我研究了一个相关的脚本(Andrew Ng. 在线类(class)),它可以将二维数据点转换为更高的特征空间。然而,我想不出一种方法来概括任意高维样本, .这是代码:

d = 6;
m = size(D,1); 
new = ones(m);
for k = 1:d
    for l = 0:k
        new(:, end+1) = (x1.^(k-l)).*(x2.^l);
    end
end

我们可以向量化这段代码吗?还给出了一个数据矩阵 您能否就我们如何使用 d 维多项式将任意维度的数据点转换为更高维度的数据点提出建议?

PS:d 维数据点的泛化会很有帮助。

最佳答案

此解决方案可以处理 k 变量并生成 d 次多项式的所有项,其中 kd 是非负整数。大部分代码长度是由于在 k 变量中生成 d 多项式的所有项的组合复杂性。

它采用n_obs乘以k数据矩阵X,其中n_obs是观察的数量,k 是变量的个数。

辅助函数

此函数生成所有可能的行,使得每个条目都是非负整数,并且行总和为正整数:

the row [0, 1, 3, 0, 1]  corresponds to (x1^0)*(x1^1)*(x2^3)*(x4^0)*(x5^1)

函数(几乎肯定可以更有效地编写)是:

function result = mg_sums(n_numbers, d)
if(n_numbers<=1)
    result = d;
else
    result = zeros(0, n_numbers);    
    for(i = d:-1:0)
        rc = mg_sums(n_numbers - 1, d - i);
        result = [result; i * ones(size(rc,1), 1), rc];
    end    
end

初始化代码

n_obs  = 1000;  % number observations
n_vars = 3;     % number of variables
max_degree  = 4;     % order of polynomial

X = rand(n_obs, n_vars);  % generate random, strictly positive data

stacked = zeros(0, n_vars); %this will collect all the coefficients...    
for(d = 1:max_degree)          % for degree 1 polynomial to degree 'order'
    stacked = [stacked; mg_sums(n_vars, d)];
end

最后一步:方法 1

newX = zeros(size(X,1), size(stacked,1));
for(i = 1:size(stacked,1))
    accumulator = ones(n_obs, 1);
    for(j = 1:n_vars)
        accumulator = accumulator .* X(:,j).^stacked(i,j);
    end
    newX(:,i) = accumulator;
end

使用方法 1 或方法 2。

最后一步:方法 2(要求数据矩阵 X 中的所有数据都是严格正数(问题是如果你有 0 个元素,-inf 不会当您调用矩阵代数例程时正确传播。)

newX = real(exp(log(X) * stacked'));  % multiplying log of data matrix by the    
                                % matrix of all possible exponent combinations
                                % effectively raises terms to powers and multiplies them!

示例运行

X = [2, 3, 5];
max_degree = 3;

堆叠矩阵及其表示的多项式项为:

 1     0     0        x1           2
 0     1     0        x2           3 
 0     0     1        x3           5
 2     0     0        x1.^2        4
 1     1     0        x1.*x2       6
 1     0     1        x1.*x3       10
 0     2     0        x2.^2        9
 0     1     1        x2.*x3       15
 0     0     2        x3.^2        25
 3     0     0        x1.^3        8
 2     1     0        x1.^2.*x2    12
 2     0     1        x1.^2.*x3    20
 1     2     0        x1.*x2.^2    18
 1     1     1        x1.*x2.*x3   30
 1     0     2        x1.*x3.^2    50
 0     3     0        x2.^3        27
 0     2     1        x2.^2.*x3    45
 0     1     2        x2.*x3.^2    75
 0     0     3        x3.^3        125

如果数据矩阵 X[2, 3, 5] 这会正确生成:

newX = [2, 3, 5, 4, 6, 10, 9, 15, 25, 8, 12, 20, 18, 30, 50, 27, 45, 75, 125];

第一列是x1,第二列是x2,第三列是x3,第四列是x1.^2,第 5 个是 x1.*x2 等等...

关于matlab - 使用多变量多项式的特征映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33660799/

相关文章:

matlab - 将我的 MATLAB 模型加载为 Weka 模型

python - 根据字典类型,什么是映射对象?

java - 在 mapstruct 中使用构建器(使用不可变注释处理器)将对象映射到不可变对象(immutable对象)

python - Matlab 相当于 `endsWith` : How to filter list of filenames regarding their extension?

MATLAB - 使用时间戳

matlab - 什么样的LDA执行 'fitcdiscr'功能?

machine-learning - 从均匀分布中采样时没有匹配 logpdf 的方法

matlab - 使用参数值输入对的缩写 - 为什么 cellfun 的 `' UniformOutput', false` 工作为 `' un', 0`?

python - 为什么我的 GPU 在矩阵运算中比 CPU 慢?

audio - 将静音音频添加到 ffmpeg 中的 channel 3-8