/* /// <summary> /// Copy all values from another solution /// </summary> /// <param name="sourceSolution">The source to copy from</param> public void Load(SVM sourceSolution) { dimension = sourceSolution.dimension; alphaList = new float[dimension]; for (int i = 0; i < dimension; i++) { alphaList[i] = sourceSolution.alphaList[i]; } b = sourceSolution.b; } */ /// <summary> /// Copy all values from another solution /// </summary> /// <param name="FileName">File containing alpha's data</param> public void Load(string FileName) { DataSet d = new DataSet(); d.ReadXml(FileName); DataTable t = d.Tables["Solution"]; dimension = t.Rows.Count; //Configuration DataTable TblCfg = d.Tables["Config"]; float valC, valTol; int valKernel, valMaxP; valC = (float)((double)TblCfg.Rows[0]["dblValues"]); valKernel = (int)((double)TblCfg.Rows[1]["dblValues"]); valTol = (float)((double)TblCfg.Rows[2]["dblValues"]); valMaxP = (int)((double)TblCfg.Rows[3]["dblValues"]); this.b = (float)((double)TblCfg.Rows[4]["dblValues"]); float Lambda = (float)((double)TblCfg.Rows[5]["dblValues"]); int xDim = (int)((double)TblCfg.Rows[6]["dblValues"]); //Reads classifications DataTable TblClassif = d.Tables["Classifications"]; alphaList = new List<float>(); TrainingSet = new TrainingSet(); for (int i = 0; i < dimension; i++) { TrainingSet.addTrainingUnit(new TrainingUnit(new float[xDim], -1)); } for (int i = 0; i < dimension; i++) { alphaList.Add((float)((double)t.Rows[i]["dblValues"])); TrainingSet.trainingArray[i].y = (float)((double)TblClassif.Rows[i]["dblValues"]) > 0 ? 1 : -1; } //Reads training set //Creates datatables for training examples DataTable Tbl = d.Tables["Examples"]; for (int i = 0; i < dimension; i ++) { for (int j = 0; j < xDim; j++) { TrainingSet.trainingArray[i].xVector[j] = (float)((double)Tbl.Rows[j + i*xDim]["dblValues"]); } } this.ProblemCfg = new ProblemConfig(Lambda, valC, valTol, valMaxP, (ProblemConfig.KernelType)valKernel); if (OpenTKWrapper.CLCalc.CLAcceleration == OpenTKWrapper.CLCalc.CLAccelerationType.UsingCL) { this.WriteToDevice(); } }
/// <summary>Creates a new multiclass SVM using desired outputs from training set. Classifications -1.0f are negative for all sets</summary> /// <param name="TSet">Training set</param> public MultiClassSVM(TrainingSet TSet) { ProblemConfig cfg = new ProblemConfig(2.529822E-8f * (float)Math.Sqrt(TSet.getN), 127.922182f, 1e-3f, 1, ProblemConfig.KernelType.RBF); initMultiSVM(TSet, cfg, true); }
/// <summary>Creates a new multiclass SVM using desired outputs from training set. Classifications -1.0f are negative for all sets</summary> /// <param name="TSet">Training set</param> /// <param name="SVMCfg">Configuration parameters</param> /// <param name="PreCalibrate">Precalibrate RBF parameter lambda? This will ignore the given value</param> public MultiClassSVM(TrainingSet TSet, ProblemConfig SVMCfg, bool PreCalibrate) { initMultiSVM(TSet, SVMCfg, PreCalibrate); }
/// <summary>Creates a new multiclass SVM using desired outputs from training set. Classifications -1.0f are negative for all sets</summary> /// <param name="TSet">Training set</param> /// <param name="SVMCfg">Configuration parameters</param> /// <param name="PreCalibrate">Precalibrate RBF parameter lambda? This will ignore the given value</param> private void initMultiSVM(TrainingSet TSet, ProblemConfig SVMCfg, bool PreCalibrate) { //Determines how many different classifications are there Classifications = new List<float>(); foreach (TrainingUnit tu in TSet.trainingArray) { if (Classifications.IndexOf(tu.y) < 0 && tu.y != -1.0f) Classifications.Add(tu.y); } //For each different possible classification, create a different SVM SVMs = new List<SVM>(); foreach (float c in Classifications) { SVM svm = new SVM(); svm.TrainingSet = new TrainingSet(); svm.ProblemCfg = SVMCfg.Clone(); SVMs.Add(svm); foreach (TrainingUnit tu in TSet.trainingArray) { TrainingUnit newTu = tu.Clone(); newTu.y = tu.y == c ? 1 : -1; svm.TrainingSet.addTrainingUnit(newTu); } //Train svm if (PreCalibrate) svm.PreCalibrateCfg(0.8f / (float)Math.Sqrt(svm.TrainingSet.getN), 0.3f / (float)Math.Sqrt(svm.TrainingSet.getN)); svm.Train(); svm.RemoveNonSupportVectors(); } }