约束高阶多项式回归

时间:2015-06-16 05:43:41

标签: matlab regression

我正在做一些骨骼分割,而这种分割的结果是围绕这个骨骼放置在圆形图案中的点。然而,当使用qCT扫描时,在我所拥有的点上存在相当多的噪声(例如来自肉体)。所以整体问题是如何消除这种噪音。

我目前正在做的是将其转换为移位数据的极坐标,这样我就可以获得从骨骼中心到角度的距离数据,具体取决于角度。

[THETA,RHO] = car2pol(N(1,:),N(2,:),center);
[THETA, id] = unique(THETA);

一旦我得到这些数据,我就进行高阶(30)多项式回归,这样可以很好地消除噪声并产生一个很好的平滑曲线。

[p,~,mu] = polyfit(THETA,RHO,30);
RHO = polyval(p,THETA,[],mu); 

然后我将其转换回笛卡尔坐标:

[x,y] = pol2car(THETA,RHO,center);

我唯一的问题是开始和结束点不一定是回归后的相同点,它们应该是。所以我的问题是,你能做出某种类型的约束多项式回归,我可以强制说第一点的y值与另一个终点的y值具有相同的值吗?或者还有其他方法吗?

1 个答案:

答案 0 :(得分:4)

我建议使用傅立叶回归,而不是多项式回归,即

rho = a0 + a1 * cos(theta) + a2 * cos(2*theta) + a3 * cos(3*theta) + ...
           b1 * sin(theta) + b2 * sin(2*theta) + b3 * sin(3*theta) + ...

例如,给出以下几点

>> plot(x, y, '.')

enter image description here

你可以转换为极坐标

>> [theta, r] = cart2pol(x, y);

并创建一个正弦和余弦数组

>> X = ones(size(theta, 1), 1);
>> for n = 1:N
       X(:, end+1) = cos(n * theta);
       X(:, end+1) = sin(n * theta);
   end

并运行标准线性回归

>> b = regress(r, X);

然后,您可以获得预测并转换回笛卡尔坐标以进行绘制

>> rhat = X * b;
>> [xhat,yhat] = pol2cart(theta, rhat);

给出了

>> plot(x, y, '.');
>> hold on;
>> plot(xhat, yhat, 'r', 'LineWidth', 2)

enter image description here