Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.31 KB | None | 0 0
  1. struct LeastSquares {
  2. m0: f64,
  3. m1: f64,
  4. m2: f64,
  5. b0: f64,
  6. b1: f64
  7. }
  8.  
  9. impl LeastSquares {
  10. fn new() -> LeastSquares {
  11. LeastSquares { m0: 0.0, m1: 0.0, m2: 0.0, b0: 0.0, b1: 0.0 }
  12. }
  13.  
  14. fn insert(&mut self, x: f64, y: f64) {
  15. self.m0 += 1.0;
  16. self.m1 += x;
  17. self.m2 += x * x;
  18. self.b0 += y;
  19. self.b1 += x * y;
  20. }
  21.  
  22. fn solve(self) -> (f64, f64) {
  23. // a m2 + b m1 = b1
  24. // a m1 + b m0 = b0
  25. let u = self.m0 * self.b1 - self.m1 * self.b0;
  26. let v = self.m2 * self.b0 - self.m1 * self.b1;
  27. let w = self.m2 * self.m0 - self.m1 * self.m1;
  28. return (u / w, v / w);
  29. }
  30. }
  31.  
  32. fn cluster(mut a: f64, mut b: f64, xs: &[f64]) -> Vec<i64> {
  33. let mut is = vec![0i64; xs.len()];
  34. let mut changed = true;
  35. while changed {
  36. changed = false;
  37. let mut ls = LeastSquares::new();
  38. for (x, cur_i) in xs.iter().zip(is.iter_mut()) {
  39. let new_i = ((x - b) / a).round() as i64;
  40. ls.insert(new_i as f64, *x);
  41. changed = changed || new_i != *cur_i;
  42. *cur_i = new_i;
  43. }
  44.  
  45. let (new_a, new_b) = ls.solve();
  46. a = new_a; b = new_b;
  47. }
  48.  
  49. return is;
  50. }
  51.  
  52. fn main() {
  53. let is = cluster(3.0, 1.5, &[1.5, 4.6, 7.1, 10.9]);
  54. println!("{:?}", is);
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement