1 文本格式
using System;
namespace Legalsoft.Truffer
{
/// <summary>
/// K-Means classification
/// </summary>
public class Kmeans
{
private int nn { get; set; }
private int mm { get; set; }
private int kk { get; set; }
private int nchg { get; set; }
private double[,] data { get; set; }
private double[,] means { get; set; }
private int[] assign { get; set; }
private int[] count { get; set; }
public Kmeans(double[,] ddata, double[,] mmeans)
{
this.nn = ddata.GetLength(0);
this.mm = ddata.GetLength(1);
this.kk = mmeans.GetLength(0);
this.data = Globals.CopyFrom(ddata);
this.means = Globals.CopyFrom(mmeans);
this.assign = new int[nn];
this.count = new int[kk];
estep();
mstep();
}
public int estep()
{
int kmin = 0;
nchg = 0;
for (int k = 0; k < kk; k++)
{
count[k] = 0;
}
for (int n = 0; n < nn; n++)
{
double dmin = 9.99e99;
for (int k = 0; k < kk; k++)
{
double d = 0.0;
for (int m = 0; m < mm; m++)
{
d += Globals.SQR(data[n, m] - means[k, m]);
}
if (d < dmin)
{
dmin = d;
kmin = k;
}
}
if (kmin != assign[n])
{
nchg++;
}
assign[n] = kmin;
count[kmin]++;
}
return nchg;
}
public void mstep()
{
for (int k = 0; k < kk; k++)
{
for (int m = 0; m < mm; m++)
{
means[k, m] = 0.0;
}
}
for (int n = 0; n < nn; n++)
{
for (int m = 0; m < mm; m++)
{
means[assign[n], m] += data[n, m];
}
}
for (int k = 0; k < kk; k++)
{
if (count[k] > 0)
{
for (int m = 0; m < mm; m++)
{
means[k, m] /= count[k];
}
}
}
}
}
}
2 代码格式
using System;
namespace Legalsoft.Truffer
{
/// <summary>
/// K-Means classification
/// </summary>
public class Kmeans
{
private int nn { get; set; }
private int mm { get; set; }
private int kk { get; set; }
private int nchg { get; set; }
private double[,] data { get; set; }
private double[,] means { get; set; }
private int[] assign { get; set; }
private int[] count { get; set; }
public Kmeans(double[,] ddata, double[,] mmeans)
{
this.nn = ddata.GetLength(0);
this.mm = ddata.GetLength(1);
this.kk = mmeans.GetLength(0);
this.data = Globals.CopyFrom(ddata);
this.means = Globals.CopyFrom(mmeans);
this.assign = new int[nn];
this.count = new int[kk];
estep();
mstep();
}
public int estep()
{
int kmin = 0;
nchg = 0;
for (int k = 0; k < kk; k++)
{
count[k] = 0;
}
for (int n = 0; n < nn; n++)
{
double dmin = 9.99e99;
for (int k = 0; k < kk; k++)
{
double d = 0.0;
for (int m = 0; m < mm; m++)
{
d += Globals.SQR(data[n, m] - means[k, m]);
}
if (d < dmin)
{
dmin = d;
kmin = k;
}
}
if (kmin != assign[n])
{
nchg++;
}
assign[n] = kmin;
count[kmin]++;
}
return nchg;
}
public void mstep()
{
for (int k = 0; k < kk; k++)
{
for (int m = 0; m < mm; m++)
{
means[k, m] = 0.0;
}
}
for (int n = 0; n < nn; n++)
{
for (int m = 0; m < mm; m++)
{
means[assign[n], m] += data[n, m];
}
}
for (int k = 0; k < kk; k++)
{
if (count[k] > 0)
{
for (int m = 0; m < mm; m++)
{
means[k, m] /= count[k];
}
}
}
}
}
}