Matlab:创建次数为n的特征的多项式组合。

时间:2018-07-27 08:30:44

标签: matlab machine-learning linear-regression

是否有任何Matlab函数或通用代码生成n阶三变量多项式方程的所有特征组合? 对于3级的三个变量,特征的组合将为1,x,y,z,x ^ 2,y ^ 2,z ^ 2,xy,yz,zx,x ^ 3,y ^ 3,z ^ 3 ,x ^ 2y,y ^ 2z,z ^ 2x,xyz ....等。

我已经从Andrew Ng的机器学习课程中获得了两个变量和n度的Matlab代码。

function out = mapFeature(X1, X2)
degree = 6;
out = ones(size(X1(:,1)));
for i = 1:degree
    for j = 0:i
        out(:, end+1) = (X1.^(i-j)).*(X2.^j);
    end
end

end

我想知道是否存在n度三个变量的任何代码。提前致谢。

2 个答案:

答案 0 :(得分:3)

还有一个基于meshgrid的简单解决方案:

degree = 3;
[i,j,k]= meshgrid(0:degree);
powers= sortrows([i(:) j(:) k(:)]);
out = [];
for m = 1:size(powers,1)
    d= powers(m,:);
    if sum(d)<=degree
        out(:, end+1) = (X1.^d(1)).*(X2.^d(2)).*(X3.^d(3));
    end
end

meshgrid函数生成三个矩阵,这些矩阵包含其参数值的3D网格。可以将此矩阵扩展为列,然后使用[i(:) j(:) k(:)]进行连接。它给我们矩阵,其行是度的组合。 sortrows对矩阵的行进行排序,以使组合顺序更自然。还有一个多维网格生成函数ndgrid,可用于3个以上变量的情况。

答案 1 :(得分:2)

您可以从this other SO question中选择出色的功能nmultichoosek

function combs = nmultichoosek(values, k)
%// Return number of multisubsets or actual multisubsets.
if numel(values)==1 
    n = values;
    combs = nchoosek(n+k-1,k);
else
    n = numel(values);
    combs = bsxfun(@minus, nchoosek(1:n+k-1,k), 0:k-1);
    combs = reshape(values(combs),[],k);
end

称呼为

combs=nmultichoosek([1 x1 x2 x3],4);

并删除第一列中所有不包含1的值

combs=combs(combs(:,1)==1,:);

最终计算列的乘积

 result=prod(comb,2);

此方法适用于任何数量的n变量,但使用较大的n时会很难看。如果更改了变量,请记住将4更改为n+1