约束高阶多项式回归
Constrained high order polynomial 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 值具有相同的值吗?或者还有其他方法吗?
我推荐傅立叶回归,而不是多项式回归,即
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, '.')
可以转极坐标
>> [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)
我正在做一些骨骼分割,而这个分割的结果是在这个骨骼周围以圆形图案放置点。然而,由于它是使用 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 值具有相同的值吗?或者还有其他方法吗?
我推荐傅立叶回归,而不是多项式回归,即
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, '.')
可以转极坐标
>> [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)