如何手动解析LibSVM模型中的支持向量进行分类?

据我所知,我可以从使用一组数据训练后生成的LibSVM模型中解析出支持向量。

生成分类器的公式是什么?

我是否需要文件头中的数据,比如以下内容(内核等…在列出的支持向量之前):

 svm_type c_svc kernel_type rbf gamma 0.125 nr_class 4 total_sv 1038 rho -0.859244 -0.876628 -0.958343 0.543365 -1.10722 -1.79433 label 2 1 3 0 nr_sv 364 276 242 156 SV

我的情况是

  • 我想在Node.JS中进行分类。但目前还没有LibSVM的绑定可用。
  • 由于我的模型不会改变,我希望在Node.JS中进行分类,并将模型保存在内存中。
  • 如果这证明速度慢,我宁愿从头开始用C++编写相同的分类,并创建一个包装模块,如果这只是一个简单的计算(正如我所怀疑的那样)。

谢谢。


回答:

您应该能够将C函数翻译成Javascript。

这是相关的代码:

double svm_predict_values(const svm_model *model, const svm_node *x, double* dec_values){        int i;        int nr_class = model->nr_class;        int l = model->l;        double *kvalue = Malloc(double,l);        for(i=0;i<l;i++)                kvalue[i] = Kernel::k_function(x,model->SV[i],model->param);        int *start = Malloc(int,nr_class);        start[0] = 0;        for(i=1;i<nr_class;i++)                start[i] = start[i-1]+model->nSV[i-1];        int *vote = Malloc(int,nr_class);        for(i=0;i<nr_class;i++)                vote[i] = 0;        int p=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[p] = sum;                        if(dec_values[p] > 0)                                ++vote[i];                        else                                ++vote[j];                        p++;                }        int vote_max_idx = 0;        for(i=1;i<nr_class;i++)                if(vote[i] > vote[vote_max_idx])                        vote_max_idx = i;        free(kvalue);        free(start);        free(vote);        return model->label[vote_max_idx];}

请注意,您需要重新创建以下方程:

enter image description here

唯一的区别是由于您的模型有4个类别,您需要实现投票系统,这基本上就是上面的代码。

希望这对您有帮助。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注