【问题标题】:Matlab: create polynomial combination of the features with degree n.Matlab:创建n次特征的多项式组合。
【发布时间】:2018-07-27 08:30:44
【问题描述】:

是否有任何 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 度的三个变量的代码。提前致谢。

【问题讨论】:

    标签: matlab machine-learning linear-regression


    【解决方案1】:

    还有一个简单的基于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个以上变量的情况。

    【讨论】:

    • 智能解决方案。
    • 很好,向你致敬 :)
    【解决方案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

    【讨论】:

    • 感谢您的帮助:) 最后一个答案很容易理解并且对我有用。如果我有时间,我也会找你的。再次感谢:)
    • @iAnas 你接受的比我的好,不用担心 ;)
    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多