Extends basic KNN search algorithm

This commit is contained in:
Volodymyr Orlov
2019-06-11 11:57:36 -07:00
parent f4d3a80490
commit a9ec6dfcd0
4 changed files with 222 additions and 53 deletions
+8 -7
View File
@@ -1,21 +1,22 @@
use super::Distance;
use ndarray::{ArrayBase, Data, Dimension};
use num_traits::Float;
use num_traits::{Num, ToPrimitive};
use ndarray::{ScalarOperand};
pub struct EuclidianDistance{}
impl<A, S, D> Distance<ArrayBase<S, D>, A> for EuclidianDistance
impl<A, S, D> Distance<ArrayBase<S, D>> for EuclidianDistance
where
A: Float,
A: Num + ScalarOperand + ToPrimitive,
S: Data<Elem = A>,
D: Dimension
{
fn distance(a: &ArrayBase<S, D>, b: &ArrayBase<S, D>) -> A {
fn distance(a: &ArrayBase<S, D>, b: &ArrayBase<S, D>) -> f64 {
if a.len() != b.len() {
panic!("vectors a and b have different length");
} else {
((a - b)*(a - b)).sum().sqrt()
((a - b)*(a - b)).sum().to_f64().unwrap().sqrt()
}
}
}
@@ -28,8 +29,8 @@ mod tests {
#[test]
fn measure_simple_euclidian_distance() {
let a = Array::from_vec(vec![1., 2., 3.]);
let b = Array::from_vec(vec![4., 5., 6.]);
let a = arr1(&[1, 2, 3]);
let b = arr1(&[4, 5, 6]);
let d = EuclidianDistance::distance(&a, &b);
+2 -4
View File
@@ -2,9 +2,7 @@ pub mod euclidian;
use num_traits::Float;
pub trait Distance<T, A>
where
A: Float
pub trait Distance<T>
{
fn distance(a: &T, b: &T) -> A;
fn distance(a: &T, b: &T) -> f64;
}