/// <summary>
        ///     Writes this Range transform to a stream.
        /// </summary>
        /// <param name="stream">The stream to write to</param>
        public void Write(Stream stream)
        {
            TemporaryCulture.Start();
            using (StreamWriter output = new StreamWriter(stream))
            {
                output.WriteLine(length);
                for (int i = 0; i < inputStart.Length; i++)
                {
                    output.WriteLine(i + 1 + ": " + inputStart[i] + " " + inputEnd[i]);
                }

                output.WriteLine();
                output.WriteLine("Scale:");
                for (int i = 0; i < inputScale.Length; i++)
                {
                    output.WriteLine(i + 1 + ": " + inputScale[i]);
                }

                output.WriteLine();
                output.WriteLine("Final:");
                output.WriteLine("{0} {1}", outputStart, outputScale);
                output.Flush();
            }
            TemporaryCulture.Stop();
        }
Exemple #2
0
        /// <summary>
        ///     Saves the transform to the disk.  The samples are not stored, only the
        ///     statistics.
        /// </summary>
        /// <param name="stream">The destination stream</param>
        public void Write(Stream stream)
        {
            TemporaryCulture.Start();

            using (StreamWriter output = new StreamWriter(stream))
            {
                output.WriteLine(means.Length);
                for (int i = 0; i < means.Length; i++)
                {
                    output.WriteLine("{0} {1}", means[i], stddevs[i]);
                }

                output.Flush();
            }

            TemporaryCulture.Stop();
        }
Exemple #3
0
        /// <summary>
        ///     Reads a GaussianTransform from the provided stream.
        /// </summary>
        /// <param name="stream">The source stream</param>
        /// <returns>The transform</returns>
        public static GaussianTransform Read(Stream stream)
        {
            TemporaryCulture.Start();

            using (StreamReader input = new StreamReader(stream))
            {
                int      length  = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
                double[] means   = new double[length];
                double[] stddevs = new double[length];
                for (int i = 0; i < length; i++)
                {
                    string[] parts = input.ReadLine().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    means[i]   = double.Parse(parts[0], CultureInfo.InvariantCulture);
                    stddevs[i] = double.Parse(parts[1], CultureInfo.InvariantCulture);
                }

                TemporaryCulture.Stop();
                return(new GaussianTransform(means, stddevs));
            }
        }
        /// <summary>
        ///     Reads a Range transform from a stream.
        /// </summary>
        /// <param name="stream">The stream to read from</param>
        /// <returns>The Range transform</returns>
        public static RangeTransform Read(Stream stream)
        {
            TemporaryCulture.Start();
            StreamReader input  = new StreamReader(stream);
            int          length = int.Parse(input.ReadLine());

            double[] inputStart = new double[length];
            double[] inputScale = new double[length];
            double[] inputEnd   = new double[length];
            int      i          = 0;
            string   line;

            string[] parts;

            while (true)
            {
                line = input.ReadLine();
                if (line == null)
                {
                    throw new NullReferenceException("Expected Line");
                }

                if (string.IsNullOrWhiteSpace(line))
                {
                    continue;
                }

                if (line.IndexOf("Scale", StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    break;
                }

                parts         = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                inputStart[i] = double.Parse(parts[1]);
                inputEnd[i]   = double.Parse(parts[2]);
                i++;
            }

            i = 0;
            while (true)
            {
                line = input.ReadLine();
                if (line == null)
                {
                    throw new NullReferenceException("Expected Line");
                }
                if (string.IsNullOrWhiteSpace(line))
                {
                    continue;
                }
                if (line.IndexOf("Final", StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    break;
                }
                parts         = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                inputScale[i] = double.Parse(parts[1]);
                i++;
            }

            parts = input.ReadLine().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            double outputStart = double.Parse(parts[0]);
            double outputScale = double.Parse(parts[1]);

            TemporaryCulture.Stop();
            return(new RangeTransform(inputStart, inputScale, outputStart, outputScale, length));
        }
Exemple #5
0
        /// <summary>
        /// Writes a model to the provided stream.
        /// </summary>
        /// <param name="stream">The output stream</param>
        public void Write(Stream stream)
        {
            TemporaryCulture.Start();

            using (StreamWriter output = new StreamWriter(stream))
            {
                Parameter param = Parameter;
                output.WriteLine($"svm_type {param.SvmType }");
                output.WriteLine($"kernel_type {param.KernelType }");
                if (param.KernelType == KernelType.Polynomial)
                {
                    output.WriteLine($"degree {param.Degree}");
                }

                if (param.KernelType == KernelType.Polynomial || param.KernelType == KernelType.RBF ||
                    param.KernelType == KernelType.Sigmoid)
                {
                    output.WriteLine($"gamma {param.Gamma}");
                }

                if (param.KernelType == KernelType.Polynomial || param.KernelType == KernelType.Sigmoid)
                {
                    output.WriteLine($"coef0 {param.Coefficient0}");
                }

                output.WriteLine($"performance {param.Performance}");

                int nrClass = NumberOfClasses;
                int l       = SupportVectorCount;
                output.WriteLine($"nr_class {nrClass}");
                output.WriteLine($"total_sv {l}");
                output.Write("rho");

                for (int i = 0; i < nrClass * (nrClass - 1) / 2; i++)
                {
                    output.Write(" " + Rho[i]);
                }

                output.WriteLine();

                if (ClassLabels != null)
                {
                    output.Write("label");
                    for (int i = 0; i < nrClass; i++)
                    {
                        output.Write(" " + ClassLabels[i]);
                    }

                    output.WriteLine();
                }

                if (PairwiseProbabilityA != null)
                // regression has probA only
                {
                    output.Write("probA");
                    for (int i = 0; i < nrClass * (nrClass - 1) / 2; i++)
                    {
                        output.Write(" " + PairwiseProbabilityA[i]);
                    }

                    output.WriteLine();
                }

                if (PairwiseProbabilityB != null)
                {
                    output.Write("probB");
                    for (int i = 0; i < nrClass * (nrClass - 1) / 2; i++)
                    {
                        output.Write(" " + PairwiseProbabilityB[i]);
                    }

                    output.WriteLine();
                }

                if (NumberOfSVPerClass != null)
                {
                    output.Write("nr_sv");
                    for (int i = 0; i < nrClass; i++)
                    {
                        output.Write(" " + NumberOfSVPerClass[i]);
                    }

                    output.WriteLine();
                }

                output.WriteLine("SV");
                double[][] svCoef         = SupportVectorCoefficients;
                Node[][]   supportVectors = SupportVectors;

                for (int i = 0; i < l; i++)
                {
                    for (int j = 0; j < nrClass - 1; j++)
                    {
                        output.Write(svCoef[j][i] + " ");
                    }

                    Node[] p = supportVectors[i];
                    if (p.Length == 0)
                    {
                        output.WriteLine();
                        continue;
                    }

                    if (param.KernelType == KernelType.Precomputed)
                    {
                        output.Write("0:{0}", (int)p[0].Value);
                    }
                    else
                    {
                        output.Write("{0}:{1}", p[0].Index, p[0].Value);
                        for (int j = 1; j < p.Length; j++)
                        {
                            output.Write(" {0}:{1}", p[j].Index, p[j].Value);
                        }
                    }

                    output.WriteLine();
                }

                output.Flush();
            }

            TemporaryCulture.Stop();
        }
Exemple #6
0
        /// <summary>
        /// Reads a Model from the provided stream.
        /// </summary>
        /// <param name="stream">The stream from which to read the Model.</param>
        /// <returns>the Model</returns>
        public static Model Read(Stream stream)
        {
            TemporaryCulture.Start();
            using (StreamReader input = new StreamReader(stream))
            {
                // read parameters
                Model     model = new Model();
                Parameter param = new Parameter();
                model.Parameter            = param;
                model.Rho                  = null;
                model.PairwiseProbabilityA = null;
                model.PairwiseProbabilityB = null;
                model.ClassLabels          = null;
                model.NumberOfSVPerClass   = null;

                bool headerFinished = false;
                while (!headerFinished)
                {
                    string line = input.ReadLine();
                    string cmd, arg;
                    int    splitIndex = line.IndexOf(' ');
                    if (splitIndex >= 0)
                    {
                        cmd = line.Substring(0, splitIndex);
                        arg = line.Substring(splitIndex + 1);
                    }
                    else
                    {
                        cmd = line;
                        arg = "";
                    }

                    arg = arg.ToLower();

                    int i, n;
                    switch (cmd)
                    {
                    case "svm_type":
                        param.SvmType = (SvmType)Enum.Parse(typeof(SvmType), arg, true);
                        break;

                    case "performance":
                        param.Performance = double.Parse(arg);
                        break;

                    case "kernel_type":
                        param.KernelType = (KernelType)Enum.Parse(typeof(KernelType), arg, true);
                        break;

                    case "degree":
                        param.Degree = int.Parse(arg);
                        break;

                    case "gamma":
                        param.Gamma = double.Parse(arg);
                        break;

                    case "coef0":
                        param.Coefficient0 = double.Parse(arg);
                        break;

                    case "nr_class":
                        model.NumberOfClasses = int.Parse(arg);
                        break;

                    case "total_sv":
                        model.SupportVectorCount = int.Parse(arg);
                        break;

                    case "rho":
                        n         = model.NumberOfClasses * (model.NumberOfClasses - 1) / 2;
                        model.Rho = new double[n];
                        string[] rhoParts = arg.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        for (i = 0; i < n; i++)
                        {
                            model.Rho[i] = double.Parse(rhoParts[i]);
                        }

                        break;

                    case "label":
                        n = model.NumberOfClasses;
                        model.ClassLabels = new int[n];
                        string[] labelParts = arg.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        for (i = 0; i < n; i++)
                        {
                            model.ClassLabels[i] = int.Parse(labelParts[i]);
                        }
                        break;

                    case "probA":
                        n = model.NumberOfClasses * (model.NumberOfClasses - 1) / 2;
                        model.PairwiseProbabilityA = new double[n];
                        string[] probAParts = arg.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        for (i = 0; i < n; i++)
                        {
                            model.PairwiseProbabilityA[i] = double.Parse(probAParts[i]);
                        }
                        break;

                    case "probB":
                        n = model.NumberOfClasses * (model.NumberOfClasses - 1) / 2;
                        model.PairwiseProbabilityB = new double[n];
                        string[] probBParts = arg.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        for (i = 0; i < n; i++)
                        {
                            model.PairwiseProbabilityB[i] = double.Parse(probBParts[i]);
                        }
                        break;

                    case "nr_sv":
                        n = model.NumberOfClasses;
                        model.NumberOfSVPerClass = new int[n];
                        string[] nrsvParts = arg.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        for (i = 0; i < n; i++)
                        {
                            model.NumberOfSVPerClass[i] = int.Parse(nrsvParts[i]);
                        }
                        break;

                    case "SV":
                        headerFinished = true;
                        break;

                    default:
                        throw new Exception("Unknown text in model file");
                    }
                }

                // read sv_coef and SV
                int m = model.NumberOfClasses - 1;
                int l = model.SupportVectorCount;
                model.SupportVectorCoefficients = new double[m][];
                for (int i = 0; i < m; i++)
                {
                    model.SupportVectorCoefficients[i] = new double[l];
                }

                model.SupportVectors = new Node[l][];
                for (int i = 0; i < l; i++)
                {
                    string[] parts = input.ReadLine().Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                    for (int k = 0; k < m; k++)
                    {
                        model.SupportVectorCoefficients[k][i] = double.Parse(parts[k]);
                    }

                    int n = parts.Length - m;
                    model.SupportVectors[i] = new Node[n];
                    for (int j = 0; j < n; j++)
                    {
                        string[] nodeParts = parts[m + j].Split(':');
                        model.SupportVectors[i][j] = new Node
                        {
                            Index = int.Parse(nodeParts[0]),
                            Value = double.Parse(nodeParts[1])
                        };
                    }
                }

                TemporaryCulture.Stop();
                return(model);
            }
        }