首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于多变量多项式的特征映射

基于多变量多项式的特征映射
EN

Stack Overflow用户
提问于 2015-11-11 22:09:40
回答 1查看 4.7K关注 0票数 9

假设我们有一个数据矩阵

数据点

我们感兴趣的是将这些数据点映射到高维特征空间。我们可以用d次多项式来做这件事。因此,对于一个序列

数据点新的数据矩阵是

我研究过一个相关的剧本(安德鲁·吴)。将二维数据转换为更高的特征空间的在线课程)。但是,我想不出一种在任意高维样本中推广的方法,

。以下是代码:

代码语言:javascript
复制
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维数据点的泛化将非常有用.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 05:26:33

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

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

辅助函数

此函数生成所有可能的行,这样每个条目都是一个非负整数,行和为正整数:

代码语言:javascript
复制
the row [0, 1, 3, 0, 1]  corresponds to (x1^0)*(x1^1)*(x2^3)*(x4^0)*(x5^1)

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

代码语言:javascript
复制
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

初始化码

代码语言:javascript
复制
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

代码语言:javascript
复制
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不能正确传播)。

代码语言:javascript
复制
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!

示例运行

代码语言:javascript
复制
X = [2, 3, 5];
max_degree = 3;

叠加矩阵及其表示的多项式项是:

代码语言:javascript
复制
 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],这将正确地生成:

代码语言:javascript
复制
newX = [2, 3, 5, 4, 6, 10, 9, 15, 25, 8, 12, 20, 18, 30, 50, 27, 45, 75, 125];

第1列为x1,第2列为x2,第3列为x3,第4列为x1.^2,第5列为x1.*x2等。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33660799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档