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