简单的最小二乘法实现
(&mut self)
| 82 | |
| 83 | /// 简单的最小二乘法实现 |
| 84 | fn recalculate_regression(&mut self) { |
| 85 | let n = self.history.len() as f64; |
| 86 | let (base_hw, base_sys) = self.history.front().unwrap(); |
| 87 | let base_sys_scalar = self.instant_to_scalar(*base_sys); |
| 88 | |
| 89 | let mut sum_x = 0.0; |
| 90 | let mut sum_y = 0.0; |
| 91 | let mut sum_xy = 0.0; |
| 92 | let mut sum_xx = 0.0; |
| 93 | |
| 94 | for (hw, sys) in &self.history { |
| 95 | let x = (*hw as f64) - (*base_hw as f64); |
| 96 | let y = self.instant_to_scalar(*sys) - base_sys_scalar; |
| 97 | |
| 98 | sum_x += x; |
| 99 | sum_y += y; |
| 100 | sum_xy += x * y; |
| 101 | sum_xx += x * x; |
| 102 | } |
| 103 | |
| 104 | let denominator = n * sum_xx - sum_x * sum_x; |
| 105 | if denominator.abs() < 1e-6 { |
| 106 | // 避免除零 (比如时间戳完全没变) |
| 107 | self.estimated_slope = 1.0; |
| 108 | self.estimated_offset = 0.0; |
| 109 | } else { |
| 110 | self.estimated_slope = (n * sum_xy - sum_x * sum_y) / denominator; |
| 111 | self.estimated_offset = (sum_y * sum_xx - sum_x * sum_xy) / denominator; |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | // 辅助:将 Instant 转为 f64 (秒), 仅用于计算差值 |
| 116 | fn instant_to_scalar(&self, t: Instant) -> f64 { |
no test coverage detected