我有一组点,如:
(x, y, z, t)
(1,3,6,0.5)
(1.5, 4,6.5, 1)
(3.5, 7, 8, 1.5)
(4, 7.25, 9,2)
我正在寻找这些点的最佳线性拟合,比如一个函数:F (t) = a * x +b * y +c * z
这是线性回归问题。"最佳匹配"取决于您定义的更好的度量。
一个简单的例子是最小二乘度量,其目的是最小化平方和:(f((x_i,y_i,z_i)) - w_i)^2
-其中w_i
是样本的测量值。
在最小二乘中,你要最小化SUM{(a*x_i+b*y_i+c*z^i - w_i)^2 | per each i }
。这个函数有一个全局最小值:
(a,b,c) = (X^T * X)^-1 * X^T * w
Where:
X is a 3xm matrix (m is the number of samples you have)
X^T - is the transposed of this matrix
w - is the measured results: `(w_1,w_2,...,w_m)`
The * operator represents matrix multiplication
还有更复杂的其他方法,使用其他距离度量,一个例子是著名的线性核SVR。
看起来你正在寻找点云的长轴。
你可以通过找到与协方差矩阵的最大特征值相关联的特征向量来解决这个问题。可能是使用幂方法的机会(例如,从离质心最远的点开始迭代)。
也可以通过奇异值分解来处理,最好使用只计算最大值的方法。
如果你的数据集包含离群值,那么RANSAC可能是一个更好的选择:随机取两个点,并计算到它们定义的直线的距离之和。重复几次,保持最佳状态。
使用平方距离将满足您对最小二乘的要求,但非平方距离将更加健壮。
你有一个线性问题。
例如,方程是Y=ax1+bx2+c*x3。
在MATLAB中执行:
B = [x1(:) x2(:) x3(:)] Y;
Y_fit = [x1(:) x2(:) x3(:)] * B;
在PYTHON中:
import numpy as np
B, _, _, _ = np.linalg.lstsq([x1[:], x2[:], x3[:]], Y)
Y_fit = np.matmul([x1[:] x2[:] x3[:]], B)