正规方法推到过程

那啥,之前笔记里这部分是略过的。这里整理一下吧。有兴趣的可以对照看看和你推倒的过程一样不。

我们先回顾一下,我们定义观测结果y和预测结果y'之间的差别为Rss:

Rss = \sum_{i=1}^{n}({y_i-y_i'} )^2= \sum_{i=1}^{n}({y_i-h(x_i)} )^2 = (y-h(X))^T*(y-h(X))

设若参数的矩阵为\theta,则h(X)=\theta*X

那么Rss  = (y-h(X))^T*(y-h(X)) =  (y-X*\theta)^T*(y-X*\theta)

按照我们的定义,这个Rss的意思是y和y'之间的差,那么当Rss无限趋近于0的时候,则y≈y',即我们求得的预测结果就等于实际结果。

于是,令Rss等于某一极小值\delta ,则(y-X*\theta)^T*(y-X*\theta) ==\delta

对参数\theta求导,得:

\frac{d}{d(\theta)}(y-X*\theta)^T*(y-X*\theta)== 2X^T*(y-X*\theta)==0

展开,得 2X^T*y==2*X^T*X*\theta

进而就可以得到\theta ==(X^T*X)^{-1}*X^T*y

于是我们就得到正规方程了。

再讲一个推导方式:

我们可以用矩阵乘法:

Y=X\theta

两边同时乘以X^T

X^TY=X^TX\theta

然后再乘以(X^TX)^{-1}

(X^TX)^{-1}X^TY=(X^TX)^{-1}X^TX\theta

就得到\theta = (X^TX)^{-1}X^TY

……不过这第二种方法是在知道了正规方程是什么以后再推导的。虽然看起来很快,然而并没有告诉你为什么。

转载:https://zhuanlan.zhihu.com/p/22474562

### TDOA 最小二乘法的推导过程及其数学原理 #### 背景介绍 到达时间差(Time Difference of Arrival, TDOA)是一种广泛应用于定位技术中的方法。其基本思想是通过测量信号到达多个接收器的时间差异来估计目标的位置。为了提高位置估计精度,通常采用最小二乘法对观测数据进行优化处理。 #### 数学模型建立 假设存在 \( N \) 个传感器节点用于检测来自目标发射源的信号,目标的真实位置记为 \( (x_t, y_t) \),第 \( i \) 和第 \( j \) 个传感器之间的距离可以表示为: \[ d_{ij} = \|s_i - s_j\|_2, \] 其中 \( s_i = (x_i, y_i) \) 表示第 \( i \) 个传感器的位置坐标[^1]。 当接收到同一信号时,两个不同传感器之间记录到的时间差可由下式给出: \[ TDOA_{ij} = t_i - t_j = \frac{\|p - s_i\|}{c} - \frac{\|p - s_j\|}{c}, \] 这里 \( c \) 是信号传播速度,\( p=(x,y) \) 是待求的目标位置向量[^2]。 #### 构建误差函数 实际应用中测得的 TDOA 值可能含有噪声干扰项 \( n_{ij} \): \[ z_{ij} = TDOA_{ij} + n_{ij}. \] 定义残差平方和作为代价函数: \[ J(x, y) = \sum_{(i,j)\in P}\left[z_{ij}-\left(\sqrt{(x-x_i)^2+(y-y_i)^2}-\sqrt{(x-x_j)^2+(y-y_j)^2}\right)/c\right]^2. \] 此即为目标函数形式之一[^3]。 #### 非线性方程组转化为线性化表达 由于原始公式是非线性的,在具体实现过程中往往先做泰勒展开近似简化成局部线性关系后再利用迭代算法逐步逼近真实解。设初始猜测值为 \( (\hat{x}, \hat{y}) \), 则有如下一阶展开式成立: \[ f_k(p+\Delta p)= f_k(p)+ J_f^k(p)*Δp+O(||Δp||²), \] 其中 \( k=1,...m; m=\binom{n}{2};n>=3 \)[^4]. 最终得到增广矩阵并解决相应的正规方程式完成参数更新直至收敛满足设定阈值条件为止。 ```python import numpy as np def compute_Jacobian(sensors_positions, current_estimate): """ 计算雅各比矩阵 """ num_sensors = len(sensors_positions) Jacobian_matrix = [] for idx_pair in combinations(range(num_sensors), r=2): si_x,si_y=sensors_positions[idx_pair[0]] sj_x,sj_y=sensors_positions[idx_pair[1]] diff=np.array([current_estimate])-np.array([[si_x],[sj_x]]) norm_diff_si=np.linalg.norm(diff[:, :, None],axis=-1).squeeze() unit_vec_si=diff/norm_diff_si[...,None] partial_derivative_wrt_x=(-unit_vec_si.T @ [[1],[-1]] ).flatten() / speed_of_light partial_derivative_wrt_y=(-unit_vec_si.T @ [[0],[-1]] ).flatten() / speed_of_light row=[partial_derivative_wrt_x ,partial_derivative_wrt_y ] Jacobian_matrix.append(row) return np.vstack(Jacobian_matrix) def least_square_TDOA(tdoa_measurements, sensors_coordinates, initial_guess): max_iter = 50 tol = 1e-8 pos_estimation = np.copy(initial_guess) prev_cost=None while True: Hessian_approximate =compute_Hessian(pos_estimation,sensors_coordinates ) residuals_vector=get_residual_values(tdoa_measurements,pos_estimation,speed_of_light,sensors_coordinates ) delta_pos=np.linalg.solve(Hessian_approximate,-residuals_vector.reshape(-1)) new_position=pos_estimation+delta_pos[:].reshape((len(delta_pos)//2,2)) cost_value=sum(residuals_vector**2) if abs(cost_value-prev_cost)<tol or count>max_iter : break prev_cost=cost_value pos_estimation=new_position.flatten() return pos_estimation if __name__ == "__main__": # Example usage with dummy data points... pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值