KSquare Utilities
SVM233::Kernel Class Referenceabstract

Kernel evaluation. More...

+ Inheritance diagram for SVM233::Kernel:

Public Member Functions

 Kernel (kkint32 l, svm_node *const *x, const svm_parameter &param)
 
virtual ~Kernel ()
 
virtual Qfloat * get_Q (kkint32 column, kkint32 len) const =0
 
virtual void swap_index (kkint32 i, kkint32 j) const
 

Static Public Member Functions

static double k_function (const svm_node *x, const svm_node *y, const svm_parameter &param)
 
static double k_function_subspace (const svm_node *x, const svm_node *y, const svm_parameter &param, const double *featureWeight)
 

Protected Attributes

double(Kernel::* kernel_function )(kkint32 i, kkint32 j) const
 

Detailed Description

Kernel evaluation.

the static method k_function is for doing single kernel evaluation the constructor of Kernel prepares to calculate the l*l kernel matrix the member function get_Q is for getting one column from the Q Matrix

Definition at line 1525 of file svm.cpp.

Constructor & Destructor Documentation

SVM233::Kernel::Kernel ( kkint32  l,
svm_node *const *  x,
const svm_parameter param 
)

Definition at line 1609 of file svm.cpp.

References SVM233::svm_parameter::coef0, SVM233::svm_parameter::degree, SVM233::svm_parameter::dim, SVM233::svm_parameter::dimSelect, SVM233::svm_parameter::gamma, kernel_function, SVM233::svm_parameter::kernel_type, SVM233::LINEAR, SVM233::POLY, SVM233::RBF, and SVM233::SIGMOID.

Referenced by SVM233::ONE_CLASS_Q::ONE_CLASS_Q(), SVM233::SVC_Q::SVC_Q(), and SVM233::SVR_Q::SVR_Q().

1613  :
1614  kernel_type (param.kernel_type),
1615  degree (param.degree),
1616  gamma (param.gamma),
1617  coef0 (param.coef0)
1618 
1619 {
1620  dim=0;
1621  if (param.dimSelect >0)
1622  {
1623  dim = param.dim;
1624  featureWeight = new double[dim];
1625  std::copy (param.featureWeight, param.featureWeight + dim, featureWeight);
1626  }
1627 
1628  switch (kernel_type)
1629  {
1630  case LINEAR:
1631  if(param.dimSelect >0)
1632  kernel_function = &Kernel::kernel_linear_subspace;
1633  else
1634  kernel_function = &Kernel::kernel_linear;
1635  break;
1636 
1637  case POLY:
1638  if(param.dimSelect >0)
1639  kernel_function = &Kernel::kernel_poly_subspace;
1640  else
1641  kernel_function = &Kernel::kernel_poly;
1642  break;
1643 
1644  case RBF:
1645  if(param.dimSelect >0)
1646  kernel_function = &Kernel::kernel_rbf_subspace;
1647  else
1648  kernel_function = &Kernel::kernel_rbf;
1649  break;
1650 
1651  case SIGMOID:
1652  if(param.dimSelect >0)
1653  kernel_function = &Kernel::kernel_sigmoid_subspace;
1654  else
1655  kernel_function = &Kernel::kernel_sigmoid;
1656  break;
1657  }
1658 
1659  clone (x, x_, l);
1660 
1661  if (kernel_type == RBF)
1662  {
1663  x_square = new double[l];
1664  for(kkint32 i=0;i<l;i++)
1665  {
1666  if(param.dimSelect > 0)
1667  x_square[i] = dotSubspace(x[i],x[i],featureWeight);
1668  else
1669  x_square[i] = dot(x[i],x[i]);
1670  }
1671  }
1672  else
1673  x_square = 0;
1674 }
kkint32 dimSelect
Definition: svm.h:102
__int32 kkint32
Definition: KKBaseTypes.h:88
double * featureWeight
Definition: svm.h:103
double(Kernel::* kernel_function)(kkint32 i, kkint32 j) const
Definition: svm.cpp:1555
double degree
Definition: svm.h:78
void clone(T *&dst, S *src, kkint32 n)
Definition: svm.cpp:690
kkint32 kernel_type
Definition: svm.h:80
double gamma
Definition: svm.h:79
double coef0
Definition: svm.h:77
SVM233::Kernel::~Kernel ( )
virtual

Definition at line 1676 of file svm.cpp.

1677 {
1678  if (dim>0)
1679  delete[] featureWeight;
1680  delete[] x;
1681  delete[] x_square;
1682 }

Member Function Documentation

virtual Qfloat* SVM233::Kernel::get_Q ( kkint32  column,
kkint32  len 
) const
pure virtual
double SVM233::Kernel::k_function ( const svm_node x,
const svm_node y,
const svm_parameter param 
)
static

Definition at line 1735 of file svm.cpp.

References SVM233::svm_parameter::coef0, SVM233::svm_parameter::degree, SVM233::svm_parameter::gamma, SVM233::svm_node::index, SVM233::svm_parameter::kernel_type, SVM233::LINEAR, SVM233::POLY, SVM233::RBF, SVM233::SIGMOID, and SVM233::svm_node::value.

Referenced by SVM233::svm_margin(), SVM233::svm_predictTwoClasses(), and SVM233::svm_train_one().

1739 {
1740 
1741  switch(param.kernel_type)
1742  {
1743  case LINEAR:
1744  return dot(x,y);
1745 
1746  case POLY:
1747  return pow(param.gamma*dot(x,y)+param.coef0,param.degree);
1748 
1749  case RBF:
1750  {
1751  double sum = 0;
1752  while(x->index != -1 && y->index !=-1)
1753  {
1754  if(x->index == y->index)
1755  {
1756  double d = x->value - y->value;
1757  sum += d*d;
1758  ++x;
1759  ++y;
1760  }
1761  else
1762  {
1763  if(x->index > y->index)
1764  {
1765  double d=y->value;
1766  sum += d*d;
1767  ++y;
1768  }
1769  else
1770  {
1771  double d=x->value;
1772  sum += d*d;
1773  ++x;
1774  }
1775  }
1776  }
1777 
1778  while(x->index != -1)
1779  {
1780  double d = x->value;
1781  sum += d*d;
1782  //sum += x->value * x->value;
1783  ++x;
1784  }
1785 
1786  while(y->index != -1)
1787  {
1788  double d=y->value;
1789  sum += d * d;
1790  //sum += y->value * y->value;
1791  ++y;
1792  }
1793 
1794  return exp (-param.gamma * sum);
1795  }
1796  case SIGMOID:
1797  return tanh(param.gamma*dot(x,y)+param.coef0);
1798  default:
1799  return 0; /* Unreachable */
1800  }
1801 }
double degree
Definition: svm.h:78
double value
Definition: svm.h:39
kkint16 index
Definition: svm.h:38
kkint32 kernel_type
Definition: svm.h:80
double gamma
Definition: svm.h:79
double coef0
Definition: svm.h:77
double SVM233::Kernel::k_function_subspace ( const svm_node x,
const svm_node y,
const svm_parameter param,
const double *  featureWeight 
)
static

Definition at line 1805 of file svm.cpp.

References SVM233::svm_parameter::coef0, SVM233::svm_parameter::degree, SVM233::svm_parameter::gamma, SVM233::svm_node::index, SVM233::svm_parameter::kernel_type, SVM233::LINEAR, SVM233::POLY, SVM233::RBF, SVM233::SIGMOID, and SVM233::svm_node::value.

Referenced by SVM233::svm_predictTwoClasses(), and SVM233::svm_train_one().

1810 {
1811  switch (param.kernel_type)
1812  {
1813  case LINEAR:
1814  return dotSubspace(x,y,featureWeight);
1815  case POLY:
1816  return pow(param.gamma*dotSubspace(x,y,featureWeight)+param.coef0,param.degree);
1817 
1818  case RBF:
1819  {
1820  double sum = 0;
1821  while(x->index != -1 && y->index !=-1)
1822  {
1823  if(x->index == y->index)
1824  {
1825  double d = x->value - y->value;
1826  sum+=d*d*featureWeight[x->index-1];
1827 
1828  ++x;
1829  ++y;
1830  }
1831  else
1832  {
1833  if(x->index > y->index)
1834  {
1835  double d=y->value;
1836  sum+=d*d*featureWeight[y->index-1];
1837  ++y;
1838  }
1839  else
1840  {
1841  double d=x->value;
1842  sum+=d*d*featureWeight[x->index-1];
1843  ++x;
1844  }
1845  }
1846  }
1847 
1848  while(x->index != -1)
1849  {
1850  double d = x->value;
1851  sum+=d*d*featureWeight[x->index-1];
1852 
1853  //sum += x->value * x->value;
1854  ++x;
1855  }
1856 
1857  while(y->index != -1)
1858  {
1859  double d=y->value;
1860 
1861  sum+=d*d*featureWeight[y->index-1];
1862 
1863  //sum += y->value * y->value;
1864  ++y;
1865  }
1866 
1867  return exp (-param.gamma * sum);
1868  }
1869  case SIGMOID:
1870  return tanh(param.gamma*dotSubspace(x,y, featureWeight)+param.coef0);
1871  default:
1872  return 0; /* Unreachable */
1873  }
1874 } /* k_function_subspace */
double degree
Definition: svm.h:78
double value
Definition: svm.h:39
kkint16 index
Definition: svm.h:38
kkint32 kernel_type
Definition: svm.h:80
double gamma
Definition: svm.h:79
double coef0
Definition: svm.h:77
virtual void SVM233::Kernel::swap_index ( kkint32  i,
kkint32  j 
) const
inlinevirtual

Reimplemented in SVM233::SVR_Q, SVM233::ONE_CLASS_Q, and SVM233::SVC_Q.

Definition at line 1547 of file svm.cpp.

Referenced by SVM233::Solver::swap_index(), SVM233::SVC_Q::swap_index(), and SVM233::ONE_CLASS_Q::swap_index().

1548  {
1549  Swap (x[i],x[j]);
1550  if(x_square) Swap(x_square[i],x_square[j]);
1551  }
void Swap(T &x, T &y)
Definition: svm.cpp:687

Member Data Documentation

double(Kernel::* SVM233::Kernel::kernel_function) (kkint32 i, kkint32 j) const
protected

The documentation for this class was generated from the following file: