⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svm.cs

📁 这是C#版本开发的SVM类库包,适合不同爱好的同学学习.
💻 CS
📖 第 1 页 / 共 5 页
字号:
					start[i] = start[i - 1] + count[i - 1];
				
				svm_node[][] x = new svm_node[l][];
				
				for (i = 0; i < l; i++)
				{
					x[start[index[i]]] = prob.x[i];
					++start[index[i]];
				}
				
				start[0] = 0;
				for (i = 1; i < nr_class; i++)
					start[i] = start[i - 1] + count[i - 1];
				
				// calculate weighted C
				
				double[] weighted_C = new double[nr_class];
				for (i = 0; i < nr_class; i++)
					weighted_C[i] = param.C;
				for (i = 0; i < param.nr_weight; i++)
				{
					int j;
					for (j = 0; j < nr_class; j++)
						if (param.weight_label[i] == label[j])
							break;
					if (j == nr_class)
						System.Console.Error.Write("warning: class label " + param.weight_label[i] + " specified in weight is not found\n");
					else
						weighted_C[j] *= param.weight[i];
				}
				
				// train k*(k-1)/2 models
				
				bool[] nonzero = new bool[l];
				for (i = 0; i < l; i++)
					nonzero[i] = false;
				decision_function[] f = new decision_function[nr_class * (nr_class - 1) / 2];
				
				double[] probA = null, probB = null;
				if (param.probability == 1)
				{
					probA = new double[nr_class * (nr_class - 1) / 2];
					probB = new double[nr_class * (nr_class - 1) / 2];
				}
				
				int p = 0;
				for (i = 0; i < nr_class; i++)
					for (int j = i + 1; j < nr_class; j++)
					{
						svm_problem sub_prob = new svm_problem();
						int si = start[i], sj = start[j];
						int ci = count[i], cj = count[j];
						sub_prob.l = ci + cj;
						sub_prob.x = new svm_node[sub_prob.l][];
						sub_prob.y = new double[sub_prob.l];
						int k;
						for (k = 0; k < ci; k++)
						{
							sub_prob.x[k] = x[si + k];
							sub_prob.y[k] = + 1;
						}
						for (k = 0; k < cj; k++)
						{
							sub_prob.x[ci + k] = x[sj + k];
							sub_prob.y[ci + k] = - 1;
						}
						
						if (param.probability == 1)
						{
							double[] probAB = new double[2];
							svm_binary_svc_probability(sub_prob, param, weighted_C[i], weighted_C[j], probAB);
							probA[p] = probAB[0];
							probB[p] = probAB[1];
						}
						
						f[p] = svm_train_one(sub_prob, param, weighted_C[i], weighted_C[j]);
						for (k = 0; k < ci; k++)
							if (!nonzero[si + k] && System.Math.Abs(f[p].alpha[k]) > 0)
								nonzero[si + k] = true;
						for (k = 0; k < cj; k++)
							if (!nonzero[sj + k] && System.Math.Abs(f[p].alpha[ci + k]) > 0)
								nonzero[sj + k] = true;
						++p;
					}
				
				// build output
				
				model.nr_class = nr_class;
				
				model.label = new int[nr_class];
				for (i = 0; i < nr_class; i++)
					model.label[i] = label[i];
				
				model.rho = new double[nr_class * (nr_class - 1) / 2];
				for (i = 0; i < nr_class * (nr_class - 1) / 2; i++)
					model.rho[i] = f[i].rho;
				
				if (param.probability == 1)
				{
					model.probA = new double[nr_class * (nr_class - 1) / 2];
					model.probB = new double[nr_class * (nr_class - 1) / 2];
					for (i = 0; i < nr_class * (nr_class - 1) / 2; i++)
					{
						model.probA[i] = probA[i];
						model.probB[i] = probB[i];
					}
				}
				else
				{
					model.probA = null;
					model.probB = null;
				}
				
				int nnz = 0;
				int[] nz_count = new int[nr_class];
				model.nSV = new int[nr_class];
				for (i = 0; i < nr_class; i++)
				{
					int nSV = 0;
					for (int j = 0; j < count[i]; j++)
						if (nonzero[start[i] + j])
						{
							++nSV;
							++nnz;
						}
					model.nSV[i] = nSV;
					nz_count[i] = nSV;
				}
				
				System.Console.Out.Write("Total nSV = " + nnz + "\n");
				
				model.l = nnz;
				model.SV = new svm_node[nnz][];
				p = 0;
				for (i = 0; i < l; i++)
					if (nonzero[i])
						model.SV[p++] = x[i];
				
				int[] nz_start = new int[nr_class];
				nz_start[0] = 0;
				for (i = 1; i < nr_class; i++)
					nz_start[i] = nz_start[i - 1] + nz_count[i - 1];
				
				model.sv_coef = new double[nr_class - 1][];
				for (i = 0; i < nr_class - 1; i++)
					model.sv_coef[i] = new double[nnz];
				
				p = 0;
				for (i = 0; i < nr_class; i++)
					for (int j = i + 1; j < nr_class; j++)
					{
						// classifier (i,j): coefficients with
						// i are in sv_coef[j-1][nz_start[i]...],
						// j are in sv_coef[i][nz_start[j]...]
						
						int si = start[i];
						int sj = start[j];
						int ci = count[i];
						int cj = count[j];
						
						int q = nz_start[i];
						int k;
						for (k = 0; k < ci; k++)
							if (nonzero[si + k])
								model.sv_coef[j - 1][q++] = f[p].alpha[k];
						q = nz_start[j];
						for (k = 0; k < cj; k++)
							if (nonzero[sj + k])
								model.sv_coef[i][q++] = f[p].alpha[ci + k];
						++p;
					}
			}
			return model;
		}
		
		public static void  svm_cross_validation(svm_problem prob, svm_parameter param, int nr_fold, double[] target)
		{
			int i;
			int[] perm = new int[prob.l];
			
			// random shuffle
			for (i = 0; i < prob.l; i++)
				perm[i] = i;
			for (i = 0; i < prob.l; i++)
			{
				//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1042_3"'
				int j = i + (int) (SupportClass.Random.NextDouble() * (prob.l - i));
				do 
				{
					int _ = perm[i]; perm[i] = perm[j]; perm[j] = _;
				}
				while (false);
			}
			for (i = 0; i < nr_fold; i++)
			{
				int begin = i * prob.l / nr_fold;
				int end = (i + 1) * prob.l / nr_fold;
				int j, k;
				svm_problem subprob = new svm_problem();
				
				subprob.l = prob.l - (end - begin);
				subprob.x = new svm_node[subprob.l][];
				subprob.y = new double[subprob.l];
				
				k = 0;
				for (j = 0; j < begin; j++)
				{
					subprob.x[k] = prob.x[perm[j]];
					subprob.y[k] = prob.y[perm[j]];
					++k;
				}
				for (j = end; j < prob.l; j++)
				{
					subprob.x[k] = prob.x[perm[j]];
					subprob.y[k] = prob.y[perm[j]];
					++k;
				}
				svm_model submodel = svm_train(subprob, param);
				if (param.probability == 1 && (param.svm_type == svm_parameter.C_SVC || param.svm_type == svm_parameter.NU_SVC))
				{
					double[] prob_estimates = new double[svm_get_nr_class(submodel)];
					for (j = begin; j < end; j++)
						target[perm[j]] = svm_predict_probability(submodel, prob.x[perm[j]], prob_estimates);
				}
				else
					for (j = begin; j < end; j++)
						target[perm[j]] = svm_predict(submodel, prob.x[perm[j]]);
			}
		}
		
		public static int svm_get_svm_type(svm_model model)
		{
			return model.param.svm_type;
		}
		
		public static int svm_get_nr_class(svm_model model)
		{
			return model.nr_class;
		}
		
		public static void  svm_get_labels(svm_model model, int[] label)
		{
			if (model.label != null)
				for (int i = 0; i < model.nr_class; i++)
					label[i] = model.label[i];
		}
		
		public static double svm_get_svr_probability(svm_model model)
		{
			if ((model.param.svm_type == svm_parameter.EPSILON_SVR || model.param.svm_type == svm_parameter.NU_SVR) && model.probA != null)
				return model.probA[0];
			else
			{
				System.Console.Error.Write("Model doesn't contain information for SVR probability inference\n");
				return 0;
			}
		}
		
		public static void  svm_predict_values(svm_model model, svm_node[] x, double[] dec_values)
		{
			if (model.param.svm_type == svm_parameter.ONE_CLASS || model.param.svm_type == svm_parameter.EPSILON_SVR || model.param.svm_type == svm_parameter.NU_SVR)
			{
				double[] sv_coef = model.sv_coef[0];
				double sum = 0;
				for (int i = 0; i < model.l; i++)
					sum += sv_coef[i] * Kernel.k_function(x, model.SV[i], model.param);
				sum -= model.rho[0];
				dec_values[0] = sum;
			}
			else
			{
				int i;
				int nr_class = model.nr_class;
				int l = model.l;
				
				double[] kvalue = new double[l];
				for (i = 0; i < l; i++)
					kvalue[i] = Kernel.k_function(x, model.SV[i], model.param);
				
				int[] start = new int[nr_class];
				start[0] = 0;
				for (i = 1; i < nr_class; i++)
					start[i] = start[i - 1] + model.nSV[i - 1];
				
				int p = 0;
				int pos = 0;
				for (i = 0; i < nr_class; i++)
					for (int j = i + 1; j < nr_class; j++)
					{
						double sum = 0;
						int si = start[i];
						int sj = start[j];
						int ci = model.nSV[i];
						int cj = model.nSV[j];
						
						int k;
						double[] coef1 = model.sv_coef[j - 1];
						double[] coef2 = model.sv_coef[i];
						for (k = 0; k < ci; k++)
							sum += coef1[si + k] * kvalue[si + k];
						for (k = 0; k < cj; k++)
							sum += coef2[sj + k] * kvalue[sj + k];
						sum -= model.rho[p++];
						dec_values[pos++] = sum;
					}
			}
		}
		
		public static double svm_predict(svm_model model, svm_node[] x)
		{
			if (model.param.svm_type == svm_parameter.ONE_CLASS || model.param.svm_type == svm_parameter.EPSILON_SVR || model.param.svm_type == svm_parameter.NU_SVR)
			{
				double[] res = new double[1];
				svm_predict_values(model, x, res);
				
				if (model.param.svm_type == svm_parameter.ONE_CLASS)
					return (res[0] > 0)?1:- 1;
				else
					return res[0];
			}
			else
			{
				int i;
				int nr_class = model.nr_class;
				double[] dec_values = new double[nr_class * (nr_class - 1) / 2];
				svm_predict_values(model, x, dec_values);
				
				int[] vote = new int[nr_class];
				for (i = 0; i < nr_class; i++)
					vote[i] = 0;
				int pos = 0;
				for (i = 0; i < nr_class; i++)
					for (int j = i + 1; j < nr_class; j++)
					{
						if (dec_values[pos++] > 0)
							++vote[i];
						else
							++vote[j];
					}
				
				int vote_max_idx = 0;
				for (i = 1; i < nr_class; i++)
					if (vote[i] > vote[vote_max_idx])
						vote_max_idx = i;
				return model.label[vote_max_idx];
			}
		}
		
		public static double svm_predict_probability(svm_model model, svm_node[] x, double[] prob_estimates)
		{
			if ((model.param.svm_type == svm_parameter.C_SVC || model.param.svm_type == svm_parameter.NU_SVC) && model.probA != null && model.probB != null)
			{
				int i;
				int nr_class = model.nr_class;
				double[] dec_values = new double[nr_class * (nr_class - 1) / 2];
				svm_predict_values(model, x, dec_values);
				
				double min_prob = 1e-7;
				double[][] tmpArray = new double[nr_class][];
				for (int i2 = 0; i2 < nr_class; i2++)
				{
					tmpArray[i2] = new double[nr_class];
				}
				double[][] pairwise_prob = tmpArray;
				
				int k = 0;
				for (i = 0; i < nr_class; i++)
					for (int j = i + 1; j < nr_class; j++)
					{
						pairwise_prob[i][j] = System.Math.Min(System.Math.Max(sigmoid_predict(dec_values[k], model.probA[k], model.probB[k]), min_prob), 1 - min_prob);
						pairwise_prob[j][i] = 1 - pairwise_prob[i][j];
						k++;
					}
				multiclass_probability(nr_class, pairwise_prob, prob_estimates);
				
				int prob_max_idx = 0;
				for (i = 1; i < nr_class; i++)
					if (prob_estimates[i] > prob_estimates[prob_max_idx])
						prob_max_idx = i;
				return model.label[prob_max_idx];
			}
			else
				return svm_predict(model, x);
		}
		
		//UPGRADE_NOTE: Final was removed from the declaration of 'svm_type_table'. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1003_3"'
		internal static readonly System.String[] svm_type_table = new System.String[]{"c_svc", "nu_svc", "one_class", "epsilon_svr", "nu_svr"};
		
		//UPGRADE_NOTE: Final was removed from the declaration of 'kernel_type_table'. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1003_3"'
		internal static readonly System.String[] kernel_type_table = new System.String[]{"linear", "polynomial", "rbf", "sigmoid"};
		
		public static void  svm_save_model(System.String model_file_name, svm_model model)
		{
			//UPGRADE_TODO: Class 'java.io.DataOutputStream' was converted to 'System.IO.BinaryWriter' which has a different behavior. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1073_javaioDataOutputStream_3"'
			//UPGRADE_TODO: Constructor 'java.io.FileOutputStream.FileOutputStream' was converted to 'System.IO.FileStream.FileStream' which has a different behavior. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1073_javaioFileOutputStreamFileOutputStream_javalangString_3"'
			/* Original System.IO.BinaryWriter fp = new System.IO.BinaryWriter(new System.IO.FileStream(model_file_name, System.IO.FileMode.Create));*/
			System.IO.StreamWriter fp = new System.IO.StreamWriter(new System.IO.FileStream(model_file_name, System.IO.FileMode.Create), System.Text.Encoding.Default);
			
			svm_parameter param = model.param;
			
			fp.Write("svm_type " + svm_type_table[param.svm_type] + "\n");
			fp.Write("kernel_type " + kernel_type_table[param.kernel_type] + "\n");
			
			if (param.kernel_type == svm_parameter.POLY)
				fp.Write("degree " + param.degree + "\n");
			
			if (param.kernel_type == svm_parameter.POLY || param.kernel_type == svm_parameter.RBF || param.kernel_type == svm_parameter.SIGMOID)
				fp.Write("gamma " + param.gamma + "\n");
			
			if (param.kernel_type == svm_parameter.POLY || param.kernel_type == svm_parameter.SIGMOID)
				fp.Write("coef0 " + param.coef0 + "\n");
			
			int nr_class = model.nr_class;
			int l = model.l;
			fp.Write("nr_class " + nr_class + "\n");
			fp.Write("total_sv " + l + "\n");
			
			{
				fp.Write("rho");
				for (int i = 0; i < nr_class * (nr_class - 1) / 2; i++)
					fp.Write(" " + model.rho[i]);
				fp.Write("\n");
			}
			
			if (model.label != null)
			{
				fp.Write("label");
				for (int i = 0; i < nr_class; i++)
					fp.Write(" " + model.label[i]);
				fp.Write("\n");
			}
			
			if (model.probA != null)
			// regression has probA only
			{
				fp.Write("probA");
				for (int i = 0; i < nr_class * (nr_class - 1) / 2; i++)
					fp.Write(" " + model.probA[i]);
				fp.Write("\n");
			}
			if (model.probB != null)
			{
				fp.Write("probB");
				for (int i = 0; i < nr_class * (nr_class - 1) / 2; i++)
					fp.Write(" " + model.probB[i]);
				fp.Write("\n");
			}
			
			if (model.nSV != null)
			{
				fp.Write("nr_sv");
				for (int i = 0; i < nr_class; i++)
					fp.Write(" " + model.nSV[i]);
				fp.Write("\n");
			}
			
			fp.Write("SV\n");
			double[][] sv_coef = model.sv_coef;
			svm_node[][] SV = model.SV;
			
			for (int i = 0; i < l; i++)
			{
				for (int j = 0; j < nr_class - 1; j++)
					fp.Write(sv_coef[j][i] + " ");
				
				svm_node[] p = SV[i];
				for (int j = 0; j < p.Length; j++)
					fp.Write(p[j].index + ":" + p[j].value_Renamed + " ");
				fp.Write("\n");
			}
			
			fp.Close();
		}
		
		private static double atof(System.String s)
		{
			return System.Double.Parse(s);
		}
		
		private static int atoi(System.String s)
		{
			return System.Int32.Parse(s);
		}
		
		public static svm_model svm_load_model(System.String model_file_name)
		{
			//UPGRADE_TODO: The differences in the expected value  of parameters for constructor 'java.io.BufferedReader.BufferedReader'  may cause compilation errors.  'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1092_3"'
			//UPGRADE_WARNING: At least one expression was used more than once in the target code. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1181_3"'
			//UPGRADE_TODO: Constructor 'java.io.FileReader.FileReader' was converted to 'System.IO.StreamReader' which has a different behavior. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1073_3"'
			/*Original System.IO.StreamReader fp = new System.IO.StreamReader(new System.IO.StreamReader(model_file_name, System.Text.Encoding.Default).BaseStream, new System.IO.StreamReader(model_file_name, System.Text.Encoding.Default).CurrentEncoding);*/
			System.IO.StreamReader fp = new System.IO.StreamReader(new System.IO.FileStream(model_file_name, System.IO.FileMode.Open), System.Text.Encoding.Default);
			
			// read parameter

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -