init commit
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
namespace AForge.Math.Metrics;
|
||||
|
||||
public sealed class CosineDistance : IDistance
|
||||
{
|
||||
public double GetDistance(double[] p, double[] q)
|
||||
{
|
||||
CosineSimilarity cosineSimilarity = new CosineSimilarity();
|
||||
return 1.0 - cosineSimilarity.GetSimilarityScore(p, q);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
using System;
|
||||
|
||||
namespace AForge.Math.Metrics;
|
||||
|
||||
public sealed class CosineSimilarity : ISimilarity
|
||||
{
|
||||
public double GetSimilarityScore(double[] p, double[] q)
|
||||
{
|
||||
double num = 0.0;
|
||||
double num2 = 0.0;
|
||||
double num3 = 0.0;
|
||||
double num4 = 0.0;
|
||||
if (p.Length != q.Length)
|
||||
{
|
||||
throw new ArgumentException("Input vectors must be of the same dimension.");
|
||||
}
|
||||
int i = 0;
|
||||
for (int num5 = p.Length; i < num5; i++)
|
||||
{
|
||||
double num6 = p[i];
|
||||
double num7 = q[i];
|
||||
num2 += num6 * num7;
|
||||
num3 += num6 * num6;
|
||||
num4 += num7 * num7;
|
||||
}
|
||||
num = System.Math.Sqrt(num3) * System.Math.Sqrt(num4);
|
||||
if (num != 0.0)
|
||||
{
|
||||
return num2 / num;
|
||||
}
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
|
||||
namespace AForge.Math.Metrics;
|
||||
|
||||
public sealed class EuclideanDistance : IDistance
|
||||
{
|
||||
public double GetDistance(double[] p, double[] q)
|
||||
{
|
||||
double num = 0.0;
|
||||
double num2 = 0.0;
|
||||
if (p.Length != q.Length)
|
||||
{
|
||||
throw new ArgumentException("Input vectors must be of the same dimension.");
|
||||
}
|
||||
int i = 0;
|
||||
for (int num3 = p.Length; i < num3; i++)
|
||||
{
|
||||
num2 = p[i] - q[i];
|
||||
num += num2 * num2;
|
||||
}
|
||||
return System.Math.Sqrt(num);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace AForge.Math.Metrics;
|
||||
|
||||
public sealed class EuclideanSimilarity : ISimilarity
|
||||
{
|
||||
public double GetSimilarityScore(double[] p, double[] q)
|
||||
{
|
||||
double num = 0.0;
|
||||
EuclideanDistance euclideanDistance = new EuclideanDistance();
|
||||
return 1.0 / (1.0 + euclideanDistance.GetDistance(p, q));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System;
|
||||
|
||||
namespace AForge.Math.Metrics;
|
||||
|
||||
public sealed class HammingDistance : IDistance
|
||||
{
|
||||
public double GetDistance(double[] p, double[] q)
|
||||
{
|
||||
double num = 0.0;
|
||||
if (p.Length != q.Length)
|
||||
{
|
||||
throw new ArgumentException("Input vectors must be of the same dimension.");
|
||||
}
|
||||
int i = 0;
|
||||
for (int num2 = p.Length; i < num2; i++)
|
||||
{
|
||||
if (p[i] != q[i])
|
||||
{
|
||||
num += 1.0;
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace AForge.Math.Metrics;
|
||||
|
||||
public interface IDistance
|
||||
{
|
||||
double GetDistance(double[] p, double[] q);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace AForge.Math.Metrics;
|
||||
|
||||
public interface ISimilarity
|
||||
{
|
||||
double GetSimilarityScore(double[] p, double[] q);
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
|
||||
namespace AForge.Math.Metrics;
|
||||
|
||||
public sealed class JaccardDistance : IDistance
|
||||
{
|
||||
public double GetDistance(double[] p, double[] q)
|
||||
{
|
||||
double num = 0.0;
|
||||
int num2 = 0;
|
||||
int num3 = 0;
|
||||
if (p.Length != q.Length)
|
||||
{
|
||||
throw new ArgumentException("Input vectors must be of the same dimension.");
|
||||
}
|
||||
int i = 0;
|
||||
for (int num4 = p.Length; i < num4; i++)
|
||||
{
|
||||
if (p[i] != 0.0 || q[i] != 0.0)
|
||||
{
|
||||
if (p[i] == q[i])
|
||||
{
|
||||
num2++;
|
||||
}
|
||||
num3++;
|
||||
}
|
||||
}
|
||||
if (num3 != 0)
|
||||
{
|
||||
return 1.0 - (double)num2 / (double)num3;
|
||||
}
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
using System;
|
||||
|
||||
namespace AForge.Math.Metrics;
|
||||
|
||||
public sealed class ManhattanDistance : IDistance
|
||||
{
|
||||
public double GetDistance(double[] p, double[] q)
|
||||
{
|
||||
double num = 0.0;
|
||||
if (p.Length != q.Length)
|
||||
{
|
||||
throw new ArgumentException("Input vectors must be of the same dimension.");
|
||||
}
|
||||
int i = 0;
|
||||
for (int num2 = p.Length; i < num2; i++)
|
||||
{
|
||||
num += System.Math.Abs(p[i] - q[i]);
|
||||
}
|
||||
return num;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
using System;
|
||||
|
||||
namespace AForge.Math.Metrics;
|
||||
|
||||
public sealed class PearsonCorrelation : ISimilarity
|
||||
{
|
||||
public double GetSimilarityScore(double[] p, double[] q)
|
||||
{
|
||||
double num = 0.0;
|
||||
double num2 = 0.0;
|
||||
double num3 = 0.0;
|
||||
double num4 = 0.0;
|
||||
double num5 = 0.0;
|
||||
int num6 = p.Length;
|
||||
if (num6 != q.Length)
|
||||
{
|
||||
throw new ArgumentException("Input vectors must be of the same dimension.");
|
||||
}
|
||||
for (int i = 0; i < num6; i++)
|
||||
{
|
||||
double num7 = p[i];
|
||||
double num8 = q[i];
|
||||
num += num7;
|
||||
num2 += num8;
|
||||
num3 += num7 * num7;
|
||||
num4 += num8 * num8;
|
||||
num5 += num7 * num8;
|
||||
}
|
||||
double num9 = num5 - num * num2 / (double)num6;
|
||||
double num10 = System.Math.Sqrt((num3 - num * num / (double)num6) * (num4 - num2 * num2 / (double)num6));
|
||||
if (num10 != 0.0)
|
||||
{
|
||||
return num9 / num10;
|
||||
}
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user