init commit

This commit is contained in:
2025-10-09 09:57:24 +09:00
commit 4d551bd74f
6636 changed files with 1218703 additions and 0 deletions

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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));
}
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,6 @@
namespace AForge.Math.Metrics;
public interface IDistance
{
double GetDistance(double[] p, double[] q);
}

View File

@@ -0,0 +1,6 @@
namespace AForge.Math.Metrics;
public interface ISimilarity
{
double GetSimilarityScore(double[] p, double[] q);
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}