feat: + cluster metrics
This commit is contained in:
@@ -29,6 +29,7 @@ use super::Distance;
|
||||
pub struct Euclidian {}
|
||||
|
||||
impl Euclidian {
|
||||
#[inline]
|
||||
pub(crate) fn squared_distance<T: RealNumber>(x: &Vec<T>, y: &Vec<T>) -> T {
|
||||
if x.len() != y.len() {
|
||||
panic!("Input vector sizes are different.");
|
||||
@@ -36,7 +37,8 @@ impl Euclidian {
|
||||
|
||||
let mut sum = T::zero();
|
||||
for i in 0..x.len() {
|
||||
sum = sum + (x[i] - y[i]).powf(T::two());
|
||||
let d = x[i] - y[i];
|
||||
sum = sum + d * d;
|
||||
}
|
||||
|
||||
sum
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/// Multitude of distance metrics are defined here
|
||||
pub mod distance;
|
||||
pub mod num;
|
||||
pub(crate) mod vector;
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
use crate::math::num::RealNumber;
|
||||
use std::collections::HashMap;
|
||||
|
||||
pub trait RealNumberVector<T: RealNumber> {
|
||||
fn unique(&self) -> (Vec<T>, Vec<usize>);
|
||||
}
|
||||
|
||||
impl<T: RealNumber> RealNumberVector<T> for Vec<T> {
|
||||
fn unique(&self) -> (Vec<T>, Vec<usize>) {
|
||||
let mut unique = self.clone();
|
||||
unique.sort_by(|a, b| a.partial_cmp(b).unwrap());
|
||||
unique.dedup();
|
||||
|
||||
let mut index = HashMap::with_capacity(unique.len());
|
||||
for (i, u) in unique.iter().enumerate() {
|
||||
index.insert(u.to_i64().unwrap(), i);
|
||||
}
|
||||
|
||||
let mut unique_index = Vec::with_capacity(self.len());
|
||||
for e in self {
|
||||
unique_index.push(index[&e.to_i64().unwrap()]);
|
||||
}
|
||||
|
||||
(unique, unique_index)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn unique() {
|
||||
let v1 = vec![0.0, 0.0, 1.0, 1.0, 2.0, 0.0, 4.0];
|
||||
assert_eq!(
|
||||
(vec!(0.0, 1.0, 2.0, 4.0), vec!(0, 0, 1, 1, 2, 0, 3)),
|
||||
v1.unique()
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user