public override Parameters[][] FromSample(ClassifiedSample <double[]> sample) { var dim = sample.GetDimension(); var classes = sample.CachedClasses; var ts = new double[classes.Count]; var result = new Parameters[classes.Count][]; var temp = new double[classes.Count][]; foreach (var cls in classes) { result[cls.Value] = new Parameters[dim]; temp[cls.Value] = new double[dim]; } for (int i = 0; i < dim; i++) { foreach (var pData in sample) { var data = pData.Key; var cls = pData.Value; var p = data[i]; temp[cls.Value][i] += p; ts[cls.Value] += p; } } foreach (var cls in classes) { var tmps = temp[cls.Value]; var rs = result[cls.Value]; var bs = ts[cls.Value]; if (UseSmoothing) { bs += m_Alpha * m_N; } for (int i = 0; i < dim; i++) { var p = tmps[i]; if (UseSmoothing) { p += m_Alpha; } rs[i] = new Parameters(p / bs); } } return(result); }
public override Parameters[][] FromSample(ClassifiedSample <double[]> sample) { var dim = sample.GetDimension(); var classes = sample.CachedClasses; var mus = new double[classes.Count]; var mys = new double[classes.Count]; var result = new Parameters[classes.Count][]; foreach (var cls in classes) { result[cls.Value] = new Parameters[dim]; } foreach (var cls in classes) { mus[cls.Value] = 0.0D; mys[cls.Value] = 0; } for (int i = 0; i < dim; i++) { foreach (var pData in sample) { var data = pData.Key; var cls = pData.Value; mus[cls.Value] += data[i]; if (i == 0) { mys[cls.Value]++; } } foreach (var cls in classes) { var mu = mus[cls.Value] / mys[cls.Value]; result[cls.Value][i] = new Parameters(mu); mus[cls.Value] = 0.0D; } } return(result); }
public override Parameters[][] FromSample(ClassifiedSample <double[]> sample) { var dim = sample.GetDimension(); var classes = sample.CachedClasses; var mus = new double[classes.Count]; var sigmas = new double[classes.Count]; var mys = new double[classes.Count]; var result = new Parameters[classes.Count][]; foreach (var cls in classes) { result[cls.Value] = new Parameters[dim]; } foreach (var cls in classes) { mus[cls.Value] = 0.0D; sigmas[cls.Value] = 0.0D; mys[cls.Value] = 0; } for (int i = 0; i < dim; i++) { foreach (var pData in sample) { var data = pData.Key; var cls = pData.Value; mus[cls.Value] += data[i]; if (i == 0) { mys[cls.Value]++; } } foreach (var cls in classes) { mus[cls.Value] /= mys[cls.Value]; } foreach (var pData in sample) { var data = pData.Key; var cls = pData.Value; var t = data[i] - mus[cls.Value]; sigmas[cls.Value] += t * t; } foreach (var cls in classes) { var sigma = Math.Sqrt(sigmas[cls.Value] / mys[cls.Value]); if (UseSigmaMinThreshold && sigma < SigmaMinThreshold) { sigma = SigmaMinThreshold; } result[cls.Value][i] = new Parameters(mus[cls.Value], sigma); mus[cls.Value] = 0.0D; sigmas[cls.Value] = 0.0D; } } return(result); }