我有一组点,如:
(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
答案 0 :(得分:3)
这是Linear Regression问题。最适合"取决于您为更好的定义的指标。
一个简单的例子是Least Squares Metric,其目的是最小化平方和:(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。
答案 1 :(得分:2)
您似乎正在寻找点云的主轴。
你可以通过找到与协方差矩阵的最大特征值相关联的特征向量来解决这个问题。可能是使用power method的机会(例如,从距离质心最远的点开始迭代)。
也可以由Singular Value Decomposition解决,最好使用仅计算最大值的方法。
如果您的数据集包含异常值,那么RANSAC可能是更好的选择:随机取两个点并计算到它们定义的直线的距离之和。重复多次并保持最佳状态。
使用平方距离将满足您对最小二乘的请求,但非平方距离将更加稳健。
答案 2 :(得分:0)
你有一个线性问题。
例如,我的方程是 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)