假设我们有一个数据矩阵 数据点 我们有兴趣将这些数据点映射到更高维的特征空间。我们可以通过使用 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
次多项式的所有项,其中 k
和 d
是非负整数。大部分代码长度是由于在 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/