K-Means: Single, Unified Fay Queryvar kernelFunctionFrequencyVectors =
cluster.Function(kernel, “*”)
.Where(evt => evt.time < Now.AddMinutes(3))
.Select(evt => new { Machine = fay.MachineID(),
Interval = evt.Cycles / CPS,
Function = evt.CallerAddr})
.GroupBy(evt => evt,
(k,g) => new { key = k, count = g.Count() });
var kernelFunctionFrequencyVectors =
cluster.Function(kernel, “*”)
.Where(evt => evt.time < Now.AddMinutes(3))
.Select(evt => new { Machine = MachineID(),
Interval = w.Cycles / CPS,
Function = w.CallerAddr})
.GroupBy(evt => evt,
(k,g) => new { key = k, count = g.Count() });
Vector Nearest(Vector pt, Vectors centers) {
var near = centers.First();
foreach (var c in centers)
if (|pt – c| < |pt – near|)
near = c;
return near;
}
Vector Nearest(Vector pt, Vectors centers) {
var near = centers.First();
foreach (var c in centers)
if (Norm(pt – c) < Norm(pt – near))
near = c;
return near;
}
Vectors OneKMeansStep(Vectors vs, Vectors cs) {
return vs.GroupBy(v => Nearest(v, cs))
.Select(g => g.Aggregate((x,y)
=> x+y)/g.Count());
}
Vectors KMeans(Vectors vs, Vectors cs, int K) {
for (int i=0; i < K; ++i)
cs = OneKMeansStep(vs, cs);
return cs;
}
Vectors OneKMeansStep(Vectors vs, Vectors cs) {
return vs.GroupBy(v => Nearest(v, cs))
.Select(g => g.Aggregate((x,y)
=> x+y)/g.Count());
}
Vectors KMeans(Vectors vs, Vectors cs, int K) {
for (int i=0; i < K; ++i)
cs = OneKMeansStep(vs, cs);
return cs;
}