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

📄 radfn.c

📁 it is regression Algorithm in C/C++.
💻 C
字号:
/*----------------------------------------------------------------------  File    : radfn.c  Contents: radial function management            (for clustering, radial basis function networks,             learning vector quantization etc.)  Author  : Christian Borgelt  History : 15.08.2003 file created from file cluster1.c            24.02.2004 parameterization changed            13.08.2004 argument 'a' changed to const            15.08.2004 functions for derivatives added            24.01.2007 inverse function rfi_cauchy and rfi_gauss added----------------------------------------------------------------------*/#include <math.h>#include <assert.h>#include "gamma.h"#include "radfn.h"/*----------------------------------------------------------------------  Preprocessor Definitions----------------------------------------------------------------------*/#define	M_PI         3.14159265358979323846  /* \pi */#define MINDENOM     1e-12      /* minimal value of denominator *//*----------------------------------------------------------------------  Functions----------------------------------------------------------------------*/double rf_cauchy (double d2, const double *a){                               /* --- (generalized) Cauchy function */  double ma;                    /* temporary buffer for m/a */  assert(a);                    /* check the function arguments */  if (d2 < 0) {                 /* if to the get normalization factor */    if ((a[0] <= -d2) || (a[1] <= 0))      return 0;                 /* check whether the integral exists */    ma = -d2 /a[0]; d2 *= -0.5; /* m/a and m/2 (m = number of dims.) */    return (a[0] *Gamma(d2) *sin(ma *M_PI))         / (2 *pow(M_PI, d2+1) *pow(a[1], ma-1));  }                             /* return the normalization factor */  if (a[0] != 2)                /* raise distance to the given power */    d2 = pow(d2, 0.5*a[0]);     /* (note that d2 is already squared) */  d2 += a[1];                   /* add offset to distance */  return (d2 > MINDENOM) ? 1/d2 : 1/MINDENOM;}  /* rf_cauchy() */            /* compute Cauchy function *//*----------------------------------------------------------------------f_cauchy(d) = 1/(d^{a_0} +a_1), default: 1/d^2For retrieving the normalization factor, it must bed2 = -(number of dimensions of the data space).----------------------------------------------------------------------*/double rf_gauss (double d2, const double *a){                               /* --- (general.) Gaussian function */  double ma;                    /* temporary buffer for m/a */  if (d2 < 0) {                 /* if to the get normalization factor */    if (a[0] <= 0) return 0;    /* check whether the integral exists */    if (a[0] == 2)              /* use simplified formula for a = 2 */      return pow(2*M_PI, 0.5*d2);    ma = -d2 /a[0]; d2 *= -0.5; /* m/a and m/2 (m = number of dims.) */    return (a[0] *Gamma(d2)) / (pow(2, ma+1) *pow(M_PI, d2) *Gamma(ma));  }                             /* return the normalization factor */  if (a[0] != 2)                /* raise distance to the given power */    d2 = pow(d2, 0.5*a[0]);     /* (note that d2 is already squared) */  return exp(-0.5 *d2);         /* compute Gaussian function */}  /* rf_gauss() *//*----------------------------------------------------------------------f_gauss(d) = exp(-0.5 *d^{a_0}), default: exp(-0.5 *d^2)For retrieving the normalization factor, it must bed2 = -(number of dimensions of the data space).----------------------------------------------------------------------*/double rfi_cauchy (double d2, const double *a){                               /* --- inverse Cauchy function */  assert(a);                    /* check the function arguments */  if (a[0] != 2)                /* raise distance to the given power */    d2 = pow(d2, 0.5*a[0]);     /* (note that d2 is already squared) */  return d2 +a[1];              /* add offset to distance */}  /* rfi_cauchy() *//*--------------------------------------------------------------------*/double rfi_gauss (double d2, const double *a){                               /* --- (general.) Gaussian function */  if (a[0] != 2)                /* raise distance to the given power */    d2 = pow(d2, 0.5*a[0]);     /* (note that d2 is already squared) */  return exp(0.5 *d2);          /* compute Gaussian function */}  /* rfi_gauss() *//*--------------------------------------------------------------------*/double rfd_cauchy (double d2, const double *a, double f){                               /* --- derivative of Cauchy function */  assert(a && (d2 >= 0));       /* check the function arguments */  if (d2   <= 0) return 0;      /* check for a positive distance */  if (f    <  0) f = rf_cauchy(d2, a);  /* get the function value */  if (a[0] == 2) return -f*f;           /* and check special cases */  if (a[0] == 4) return -2 *f*f *sqrt(d2);  return -0.5 *a[0] *f*f *pow(d2, 0.25 *a[0] -0.5);}  /* rfd_cauchy() */            /* return the derivative *//*--------------------------------------------------------------------*/double rfd_gauss (double d2, const double *a, double f){                               /* --- derivative of Gaussian func. */  assert(a && (d2 >= 0));       /* check the function arguments */  if (d2   <= 0) return 0;      /* check for a positive distance */  if (f    <  0) f = rf_gauss(d2, a);   /* get the function value */  if (a[0] == 2) return -0.5 *f;        /* and check special cases */  if (a[0] == 4) return -f *sqrt(d2);  return -0.25 *a[0] *f *pow(d2, 0.25 *a[0] -0.5);}  /* rfd_gauss() */            /* return the derivative */

⌨️ 快捷键说明

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