亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lasvm.c

?? 用C語言實現的最新且最快的SVM源碼,可用于解決多類分類問題
?? C
字號:
/*********************************************************************** *  *  LASVM -- online svm. *  Copyright (C) 2005 NEC Labs America *  *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. *  *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. *  *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA *  ***********************************************************************//*********************************************************************** * $Id: lasvm.c,v 1.4 2005/11/16 00:10:01 agbs Exp $ **********************************************************************/#include <stdlib.h>#include <stdarg.h>#include <stdio.h>#include <string.h>#include <float.h>#include <math.h>#include "messages.h"#include "kcache.h"#include "lasvm.h"#ifndef min# define min(a,b) (((a)<(b))?(a):(b))#endif#ifndef max# define max(a,b) (((a)>(b))?(a):(b))#endif#ifndef FLT_MAX# define FLT_MAX 1e+20#endif#ifndef FLT_EPSILON# define FLT_EPSILON 1e-6#endif#if USE_CBLAS# include <cblas.h># unded  USE_FLOAT# define USE_FLOAT 1#endif#if USE_FLOAT# define real_t float#else# define real_t double#endifstatic void *xmalloc(int n){  void *p = malloc(n);  if (! p)     lasvm_error("Function malloc() has returned NULL.\n");  return p;}static void *xrealloc(void *ptr, int n){  if (! ptr)    ptr = malloc(n);  else    ptr = realloc(ptr, n);  if (! ptr)     lasvm_error("Function realloc() has returned NULL.\n");  return ptr;}struct lasvm_s {  lasvm_kcache_t *kernel;  int     sumflag;  real_t  cp;  real_t  cn;  int     maxl;  int     s;  int     l;  real_t *alpha;  real_t *cmin;  real_t *cmax;  real_t *g;  real_t  gmin, gmax;  int     imin, imax;  int     minmaxflag;};static voidchecksize(lasvm_t *self, int l){  int maxl = max(l,256);  while (maxl < l)    maxl += maxl;  self->alpha = (real_t*)xrealloc(self->alpha, maxl*sizeof(real_t));  self->cmin = (real_t*)xrealloc(self->cmin, maxl*sizeof(real_t));  self->cmax = (real_t*)xrealloc(self->cmax, maxl*sizeof(real_t));  self->g = (real_t*)xrealloc(self->g, maxl*sizeof(real_t));  self->maxl = maxl;}lasvm_t *lasvm_create( lasvm_kcache_t *cache,              int sumflag, double cp, double cn ){  lasvm_t *self = (lasvm_t*)xmalloc(sizeof(lasvm_t));  memset(self, 0, sizeof(lasvm_t));  self->kernel = cache;  self->cp = cp;  self->cn = cn;  self->sumflag = sumflag;  checksize(self, 0);  return self;}void lasvm_destroy( lasvm_t *self ){  if (self->alpha) free(self->alpha);  if (self->cmin) free(self->cmin);  if (self->cmax) free(self->cmax);  if (self->g) free(self->g);  memset(self, 0, sizeof(lasvm_t));  free(self);}int lasvm_get_l( lasvm_t *self ){  return self->l;}double lasvm_get_cp( lasvm_t *self ){  return self->cp;}double lasvm_get_cn( lasvm_t *self ){  return self->cn;}intlasvm_get_alpha(lasvm_t *self, double *alpha){  int i;  int l = self->l;  for (i=0; i<l; i++)    alpha[i] = self->alpha[i];  return l;}intlasvm_get_sv(lasvm_t *self, int *sv){  int i;  int l = self->l;  int *r2i = lasvm_kcache_r2i(self->kernel, l);  for (i=0; i<l; i++)    sv[i] = r2i[i];  return l;}intlasvm_get_g(lasvm_t *self, double *g){  int i;  int l = self->l;  for (i=0; i<l; i++)    g[i] = self->g[i];  return l;}static voidminmax( lasvm_t *self ){  if (! self->minmaxflag)    {      int i;      int l = self->s;      int imin = -1;      int imax = -1;      real_t gmin = 0;      real_t gmax = 0;      real_t *alpha = self->alpha;      real_t *g = self->g;      real_t *cmin = self->cmin;      real_t *cmax = self->cmax;      if (self->sumflag)        {          gmin = FLT_MAX;          gmax = -FLT_MAX;        }      for (i=0; i<l; i++)        {          real_t gi = g[i];          real_t ai = alpha[i];          if (gi<gmin && ai>cmin[i])            {              imin = i;              gmin = gi;            }          if (gi>gmax && ai<cmax[i])            {              imax = i;              gmax = gi;            }        }      self->gmin = gmin;      self->gmax = gmax;      self->imin = imin;      self->imax = imax;      self->minmaxflag = 1;    }}static intgs1( lasvm_t *self, int i, double epsgr){  int l = self->s;  real_t g;  real_t step, ostep, curv;  float *row;  int *r2i;  /* Determine coordinate to process */  if (i < 0)    {      minmax(self);      if (self->gmin + self->gmax < 0)        i = self->imin;      else        i = self->imax;      if (i < 0)        return 0;    }  /* Determine maximal step */    g = self->g[i];  if (g < 0)    {      step = self->alpha[i] - self->cmin[i];      if (self->gmax - g < epsgr)        return 0;    }  else    {      step = self->cmax[i] - self->alpha[i];      if (g - self->gmin < epsgr)        return 0;    }  /* Determine curvature */  r2i = lasvm_kcache_r2i(self->kernel, l);  row = lasvm_kcache_query_row(self->kernel, r2i[i], l);  curv = row[i];  if (curv >= FLT_EPSILON)    {      ostep = fabs(g)/curv;      if (ostep < step)        step = ostep;    }  else if (curv + FLT_EPSILON <= 0)    lasvm_error("Kernel is not positive (negative curvature)\n");      /* Perform update */  if (g < 0)    step = -step;  self->alpha[i] += step;#if USE_CBLAS  cblas_saxpy(l, -step, row, 1, self->g, 1);#else  {    int j;    for (j=0; j<l; j++)      self->g[j] -= step * row[j];  }#endif  self->minmaxflag = 0;  return 1;}static intgs2( lasvm_t *self, int imin, int imax, double epsgr){  int l = self->s;  real_t gmin, gmax;  real_t step, ostep, curv;  float *rmin, *rmax;  int *r2i;  /* Determine coordinate to process */  if (imin < 0 || imax < 0)    {      minmax(self);      if (imin < 0)        imin = self->imin;      if (imax < 0)        imax = self->imax;    }  if (imin < 0 || imax < 0)    return 0;  gmin = self->g[imin];  gmax = self->g[imax];  if (gmax - gmin < epsgr)    return 0;  /* Determine maximal step */    step = self->alpha[imin] - self->cmin[imin];  ostep = self->cmax[imax] - self->alpha[imax];  if (ostep < step)    step = ostep;  /* Determine curvature */  r2i = lasvm_kcache_r2i(self->kernel, l);  rmin = lasvm_kcache_query_row(self->kernel, r2i[imin], l);  rmax = lasvm_kcache_query_row(self->kernel, r2i[imax], l);  curv = rmax[imax]+rmin[imin]-rmax[imin]-rmin[imax];  if (curv >= FLT_EPSILON)    {      real_t ostep = (gmax - gmin) / curv;      if (ostep < step)        step = ostep;    }  else if (curv + FLT_EPSILON <= 0)    lasvm_error("Kernel is not positive (negative curvature)\n");      /* Perform update */  self->alpha[imax] += step;  self->alpha[imin] -= step;#if USE_CBLAS  cblas_saxpy(l, -step, rmax, 1, self->g, 1);  cblas_saxpy(l,  step, rmin, 1, self->g, 1);#else  {    int j;    for (j=0; j<l; j++)      self->g[j] -= step * ( rmax[j] - rmin[j] );  }#endif  self->minmaxflag = 0;  return 1;}static voidswap( lasvm_t *self, int r1, int r2){#define swap(type, v)        \  { type tmp = self->v[r1];  \    self->v[r1]=self->v[r2]; \    self->v[r2]=tmp; }  lasvm_kcache_swap_rr(self->kernel, r1, r2);  swap(real_t, alpha);  swap(real_t, cmin);  swap(real_t, cmax);  swap(real_t, g);  if (self->minmaxflag)    {      if (self->imin==r1)         self->imin=r2;      if (self->imin==r2)         self->imin=r1;      if (self->imax==r1)         self->imax=r2;      if (self->imax==r2)         self->imax=r1;    }#undef swap}static voidevict( lasvm_t *self ){  int i;  int l = self->l;  real_t *alpha = self->alpha;  real_t *cmin = self->cmin;  real_t *cmax = self->cmax;  real_t *g = self->g;    if (self->sumflag)    {      real_t gmin, gmax;      minmax(self);      gmin = self->gmin;      gmax = self->gmax;      for (i=0; i<l; i++)        if (alpha[i] == 0)          if ((g[i]>=gmax && 0>=cmax[i]) ||              (g[i]<=gmin && 0<=cmin[i])  )            swap(self, i--, --l);      self->l = self->s = l;    }  else    {      for (i=0; i<l; i++)        if (alpha[i] == 0)          if ((g[i]>=0 && 0>=cmax[i]) ||              (g[i]<=0 && 0<=cmin[i])  )            swap(self, i--, --l);      self->l = self->s = l;    }}int lasvm_process( lasvm_t *self, int xi, double y ){  int l = self->l;  int *i2r = 0;  float *row = 0;  real_t g;  int j;  /* Checks */  if (self->s != self->l)    lasvm_error("lasvm_process(): internal error\n");  if (y != +1 && y != -1)    lasvm_error("lasvm_process(): argument y must be +1 or -1\n");  /* Bail out if already in expansion? */  i2r = lasvm_kcache_i2r(self->kernel, 1+xi);  if (i2r[xi] < l)    return self->l;   /* Compute gradient */  g = y;  if (l > 0)    {      row = lasvm_kcache_query_row(self->kernel, xi, l);      for (j=0; j<l; j++)	g -= self->alpha[j] * row[j];    }  /* Decide insertion */  if (self->sumflag)    {      minmax(self);      if (self->gmin < self->gmax)	if ((y>0 && g<self->gmin) || 	    (y<0 && g>self->gmax)  )	  {	    lasvm_kcache_discard_row(self->kernel, xi);	    return 0;	  }    }  else    {      if (y * g < 0)	{	  lasvm_kcache_discard_row(self->kernel, xi);	  return 0;	}    }  /* Insert */  checksize(self, l+1);  lasvm_kcache_swap_ri(self->kernel, l, xi);  self->alpha[l] = 0;  self->g[l] = g;  if (y > 0)    {      self->cmin[l] = 0;      self->cmax[l] = self->cp;    }  else    {      self->cmin[l] = - self->cn;      self->cmax[l] = 0;    }  self->l = self->s = l+1;  /* Process */  if (! self->sumflag)    gs1(self, l, 0);  else if (y > 0)    gs2(self, -1, l, 0);  else     gs2(self, l, -1, 0);  self->minmaxflag = 0;  return self->l;}int lasvm_reprocess(lasvm_t *self, double epsgr){  int status;  if (self->s != self->l)    lasvm_error("lasvm_process(): internal error\n");  if (self->sumflag)    status = gs2(self, -1, -1, epsgr);  else    status = gs1(self, -1, epsgr);  evict(self);  if (status)    return self->l;  return 0;}static voidshrink(lasvm_t *self){  int i;  int s = self->s;  real_t *alpha = self->alpha;  real_t *cmin = self->cmin;  real_t *cmax = self->cmax;  real_t *g = self->g;  if (self->sumflag)    {      real_t gmin, gmax;      minmax(self);      gmin = self->gmin;      gmax = self->gmax;      for (i=0; i<s; i++)        if ((g[i]>=gmax && alpha[i]>=cmax[i]) ||            (g[i]<=gmin && alpha[i]<=cmin[i])  )          swap(self, i--, --s);      self->s = s;    }  else    {      for (i=0; i<s; i++)        if ((g[i]>=0 && alpha[i]>=cmax[i]) ||            (g[i]<=0 && alpha[i]<=cmin[i])  )          swap(self, i--, --s);      self->s = s;    }}static voidunshrink(lasvm_t *self){  int l = self->l;  int s = self->s;  if (s < l)    {      real_t *alpha = self->alpha;      real_t *g = self->g;      int *r2i = lasvm_kcache_r2i(self->kernel, l);      real_t a;      int i,j;      for(i=s; i<l; i++)        g[i] = (alpha[i]>0) ? 1.0 : -1.0;      for(j=0; j<l; j++)        if ((a = alpha[j]) != 0)          {	    int xj = r2i[j];	    int cached = lasvm_kcache_status_row(self->kernel, xj);            float *row = lasvm_kcache_query_row(self->kernel, r2i[j], l);            for (i=s; i<l; i++)              g[i] -= a * row[i];	    if (! cached) /* do not keep what was not cached */	      lasvm_kcache_discard_row(self->kernel, xj);          }      self->minmaxflag = 0;      self->s = l;    }}int lasvm_finish(lasvm_t *self, double epsgr){  int iter = 0;  int siter = 0;  int status = self->l;  while( status )    {      if (iter >= siter)        {          shrink(self);          siter = iter + min(1000,self->l);        }      if (self->sumflag)        status = gs2(self, -1, -1, epsgr);      else        status = gs1(self, -1, epsgr);      iter++;    }  unshrink(self);  evict(self);  return iter;}double lasvm_get_delta(lasvm_t *self){  double d;  minmax(self);  d = self->gmax - self->gmin;  return max(0, d);}double lasvm_get_b(lasvm_t *self){  if (self->sumflag)    {      minmax(self);      return - (self->gmax + self->gmin) / 2;    }  return 0;}double lasvm_get_w2(lasvm_t *self){  int i;  int l = self->l;  real_t *alpha = self->alpha;  real_t *g = self->g;  real_t s = 0;  for (i=0; i<l; i++)    if (alpha[i]>0)      s += alpha[i] * ( g[i] + 1.0 );    else if (alpha[i]<0)      s += alpha[i] * ( g[i] - 1.0 );  return s/2.0;}double lasvm_predict(lasvm_t *self, int xi){  int l = self->l;  float *row = lasvm_kcache_query_row(self->kernel, xi, l);  real_t *alpha = self->alpha;  real_t s = 0;  if (self->sumflag)    minmax(self);#if USE_CBLAS  s = cblas_sdot(l, alpha, 1, row, 1);#else  {    int j;    for (j=0; j<l; j++)      s += alpha[j] * row[j];  }#endif  if (self->sumflag)    s += (self->gmin + self->gmax) / 2;  return s;}double lasvm_predict_nocache(lasvm_t *self, int xi){   int cached = lasvm_kcache_status_row(self->kernel, xi);  real_t s = lasvm_predict(self, xi);  if (! cached) /* do not keep what was not cached */    lasvm_kcache_discard_row(self->kernel, xi);  return s;}void lasvm_init( lasvm_t *self, int l,                  const int *sv,                  const double *alpha,                  const double *g ){  int i,k;  if (l <= 0)    lasvm_error("Argument l should be positive.\n");  checksize(self, l);  self->l = 0;  for (i=k=0; i<l; i++)    {      if (alpha[i])        {          lasvm_kcache_swap_ri(self->kernel, k, sv[i]);          self->alpha[k] = alpha[i];          if (alpha[i]>0)            {              self->cmin[k] = 0;              self->cmax[k] = self->cp;              self->g[k] = +1;            }          else            {              self->cmin[k] = - self->cn;              self->cmax[k] = 0;              self->g[k] = -1;            }          if (g)            self->g[k] = g[i];          k++;        }    }  if (! g)    {      int *r2i = lasvm_kcache_r2i(self->kernel, k);      for (i=0; i<k; i++)        {          real_t s = self->g[i];          float *row = lasvm_kcache_query_row(self->kernel, r2i[i] , k);#if USE_CBLAS          s -= cblas_sdot(k, self->alpha, 1, row, 1);#else          {            int j;            for (j=0; j<k; j++)              s -= self->alpha[j] * row[j];          }#endif          self->g[i] = s;        }    }  self->l = self->s = k;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲人成伊人成综合网小说| 亚洲精品午夜久久久| 亚洲美女电影在线| 99re成人在线| 亚洲精品久久久蜜桃| 91一区一区三区| 亚洲午夜免费视频| 欧美日韩综合在线免费观看| 日韩精品成人一区二区在线| 91精品国产91综合久久蜜臀| 看电视剧不卡顿的网站| 亚洲精品在线免费播放| 高清不卡在线观看| 一区在线播放视频| 色爱区综合激月婷婷| 香蕉成人伊视频在线观看| 日韩一区二区在线看| 午夜不卡av在线| 精品婷婷伊人一区三区三| 欧美aa在线视频| 69久久夜色精品国产69蝌蚪网| 国产精品成人一区二区艾草| 久久久久久99久久久精品网站| 国产精品嫩草影院av蜜臀| 久久精品网站免费观看| 欧美一卡二卡在线| 色呦呦国产精品| 欧美精品久久99| 日韩欧美在线影院| 亚洲人精品午夜| 五月婷婷久久丁香| 成人激情图片网| 欧美色老头old∨ideo| 欧美日韩mp4| 亚洲欧美日韩国产成人精品影院| 欧美图片一区二区三区| 极品美女销魂一区二区三区免费| 国产精品国产三级国产三级人妇| 欧美二区在线观看| 国产福利精品导航| 亚洲成av人影院| 国产欧美一区二区精品婷婷| 91国偷自产一区二区使用方法| 日本不卡一区二区三区高清视频| 日本一区二区免费在线| 欧美蜜桃一区二区三区| 波多野结衣欧美| 久久国产精品99精品国产| 亚洲另类在线制服丝袜| 中文字幕日韩精品一区| 欧美成人免费网站| 欧美三级三级三级爽爽爽| 成人午夜视频免费看| 免费视频最近日韩| 亚洲一区中文在线| 中文字幕亚洲不卡| 国产午夜精品久久久久久免费视| 欧美一区三区四区| 欧美系列在线观看| 色综合久久久久久久| 久久99精品国产麻豆婷婷洗澡| 亚洲第一激情av| 亚洲精品一二三区| 18涩涩午夜精品.www| 国产亚洲欧美激情| 精品国产成人在线影院| 91精品国产综合久久婷婷香蕉| 欧美最猛黑人xxxxx猛交| 成年人午夜久久久| 懂色av噜噜一区二区三区av| 韩国三级中文字幕hd久久精品| 热久久国产精品| 香蕉乱码成人久久天堂爱免费| 亚洲尤物视频在线| 亚洲伊人伊色伊影伊综合网| 一区二区三区在线免费播放| 亚洲日本丝袜连裤袜办公室| 国产精品国产三级国产有无不卡 | 色婷婷综合五月| 成人手机电影网| 岛国一区二区在线观看| 国产成人av一区二区三区在线 | 亚洲精品国产第一综合99久久| 国产精品美女久久久久aⅴ国产馆| 久久你懂得1024| 国产亚洲欧美一级| 国产精品亲子伦对白| 国产精品久久久久一区二区三区| 国产午夜亚洲精品午夜鲁丝片| 久久久噜噜噜久久人人看| 久久人人爽人人爽| 中文字幕不卡三区| 亚洲免费观看高清完整版在线观看熊| 自拍偷在线精品自拍偷无码专区 | 日韩区在线观看| 欧美一区2区视频在线观看| 日韩美一区二区三区| 久久综合资源网| 国产精品美女久久久久久2018 | 一区二区三区不卡视频| 亚洲黄网站在线观看| 亚洲国产一区二区视频| 免费一级欧美片在线观看| 国产精品亚洲成人| eeuss鲁片一区二区三区| 欧洲亚洲精品在线| 日韩一区二区在线免费观看| 国产午夜精品一区二区| 一区二区三区91| 美女视频黄 久久| 成人一级片在线观看| 欧美在线视频你懂得| 欧美一区二区三区视频免费播放| 久久久久久久综合日本| 成人欧美一区二区三区小说| 丝袜a∨在线一区二区三区不卡| 老司机午夜精品| 99久久99久久精品免费观看| 7777精品伊人久久久大香线蕉的 | 一区2区3区在线看| 九色|91porny| 91美女片黄在线观看91美女| 欧美电影在线免费观看| 国产日韩欧美激情| 亚洲成人你懂的| 国产福利不卡视频| 欧美肥大bbwbbw高潮| 日韩欧美成人激情| 免费亚洲电影在线| 欧美婷婷六月丁香综合色| 精品国产一区二区三区久久久蜜月 | 美女视频网站久久| 国产精品一卡二卡| 欧美丝袜自拍制服另类| 欧美精品一区二区三区蜜桃视频 | 在线亚洲人成电影网站色www| 宅男噜噜噜66一区二区66| 国产精品三级视频| 另类小说一区二区三区| 91久久国产综合久久| 国产色产综合色产在线视频| 日韩精品一二三区| 色婷婷激情久久| 国产无人区一区二区三区| 日韩在线一区二区| 在线欧美小视频| 国产精品久久久久久久久图文区 | 日韩精品1区2区3区| 国产成人精品在线看| 在线成人小视频| 亚洲欧美经典视频| 国产jizzjizz一区二区| 欧美一二三区精品| 三级影片在线观看欧美日韩一区二区| 99国产精品国产精品久久| 久久免费国产精品| 美女性感视频久久| 欧美精品第1页| 亚洲成人av一区二区| 在线视频一区二区三| 中文字幕在线观看一区| 国产99一区视频免费| 久久久精品中文字幕麻豆发布| 美女脱光内衣内裤视频久久影院| 欧美调教femdomvk| 亚洲第一激情av| 欧美日韩成人高清| 天天av天天翘天天综合网| 欧美色偷偷大香| 午夜视频一区二区三区| 99久久国产免费看| 日本中文在线一区| 亚洲日本丝袜连裤袜办公室| 欧美一区二区视频网站| 国产精品第13页| 青娱乐精品视频| 日韩你懂的电影在线观看| 天天操天天干天天综合网| 91精品国产欧美一区二区18 | 人妖欧美一区二区| 欧美一卡二卡在线| 久久国产福利国产秒拍| 久久久五月婷婷| 丁香六月综合激情| 亚洲欧美经典视频| 欧美日韩中文一区| 男男视频亚洲欧美| 国产色产综合产在线视频| 不卡一区在线观看| 一区二区久久久久| 日韩一级完整毛片| 国产成人免费视频网站 | 91精品久久久久久蜜臀| 青青草原综合久久大伊人精品| 中文字幕一区二区三区av| 日本中文在线一区| 欧美国产日本视频| 99久久99久久久精品齐齐| 亚洲午夜电影在线| 精品久久久久久久久久久久包黑料|