mirror of
https://github.com/esiur/esiur-dotnet.git
synced 2025-05-07 12:02:59 +00:00
KMean
This commit is contained in:
parent
9775b2a878
commit
2325bbcb34
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
@ -35,9 +36,9 @@ namespace Esiur.Analysis.Statistics
|
|||||||
|
|
||||||
public static double RMS(this double[] x)
|
public static double RMS(this double[] x)
|
||||||
{
|
{
|
||||||
var r = Math.Sqrt(x.Sum(x =>(float) x * (float) x) / x.Length);
|
var r = Math.Sqrt(x.Sum(x => (float)x * (float)x) / x.Length);
|
||||||
//if (double.IsNaN(r) || double.IsInfinity(r))
|
//if (double.IsNaN(r) || double.IsInfinity(r))
|
||||||
// Console.WriteLine();
|
// Console.WriteLine();
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,5 +47,50 @@ namespace Esiur.Analysis.Statistics
|
|||||||
{
|
{
|
||||||
return Covariance(x, y) / (StdDiv(x) * StdDiv(y));
|
return Covariance(x, y) / (StdDiv(x) * StdDiv(y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static double Distance(this PointF from, PointF to)
|
||||||
|
{
|
||||||
|
return Math.Sqrt(Math.Pow(from.X - to.X, 2) + Math.Pow(from.Y - to.Y, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
class KClass
|
||||||
|
{
|
||||||
|
public int Id;
|
||||||
|
public PointF Center;
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"C{Id} <{Center.X}, {Center.Y}>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Dictionary<string, PointF> KMean(PointF[] seeds, PointF[] points)
|
||||||
|
{
|
||||||
|
// calculate distance
|
||||||
|
|
||||||
|
|
||||||
|
var classes = new Dictionary<KClass, List<PointF>>();
|
||||||
|
for (var i = 0; i < seeds.Length; i++)
|
||||||
|
classes.Add(new KClass() { Id = i+1, Center = seeds[i] }, new List<PointF>());
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
|
||||||
|
foreach (var point in points)
|
||||||
|
{
|
||||||
|
var cls = classes.Keys.OrderBy(x => x.Center.Distance(point)).First();
|
||||||
|
classes[cls].Add(point);
|
||||||
|
}
|
||||||
|
|
||||||
|
// update center
|
||||||
|
foreach(var kv in classes)
|
||||||
|
{
|
||||||
|
kv.Key.Center = new PointF() { X = kv.Value.Average(p => p.X), Y = kv.Value.Average(p => p.Y) };
|
||||||
|
kv.Value.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user