psycho-skin-accuracyEstimator.C

00001 #include "psycho-skin-accuracyEstimator.h"
00002 #include <vector>
00003 #include <iostream>
00004 #include <string>
00005 #include <stdio.h>
00006 #include <stdlib.h>
00007 #include <sstream>
00008 #include <time.h>
00009 #include <math.h>
00010 
00011 using namespace std ;
00012 
00013 IntString::IntString( int* m , int s)
00014 {
00015         mems = new int[s] ;
00016         for(int i = 0 ; i < s ; i++ ) mems[i] = *(m + i) ;
00017         theSize = s ;
00018         degree = -1 ;
00019 }
00020 
00021 // ######################################################################
00022 IntString::~IntString()
00023 
00024 {
00025         delete[] mems;
00026 }
00027 
00028 // ######################################################################
00029 
00030 inline int IntString::getDegree(){
00031         if (degree == -1 ){
00032                 degree = 0 ;
00033                 for(int i = 0 ;  i < theSize ; i++)
00034                         degree += *(mems + i) ;
00035         }
00036         return degree ;
00037 }
00038 // ######################################################################
00039 inline int IntString::size(){
00040         return theSize ;
00041 }
00042 // ######################################################################
00043 inline int IntString::getElementAt(int i) {
00044 
00045         return *(mems + i) ;
00046 }
00047 // ######################################################################
00048 
00049 inline void IntString::set(int pos , int val){
00050         *(mems + pos) = val ;
00051 }
00052 // ######################################################################
00053 std::string  IntString::toString(){
00054         string s("") ;
00055         for(int i = 0 ; i < theSize ; i++) {
00056                 int m = *(mems + i) ;
00057                 s += stringify(m) ;
00058         }
00059         return s ;
00060 }
00061 // ######################################################################
00062 string IntString::stringify(int i)
00063 {
00064         ostringstream o ;
00065         o << i ;
00066         return o.str();
00067 }
00068 // ######################################################################
00069 
00070 IntString* getTPS(IntString& testIntStr , IntString& repIntStr){
00071         int s  =testIntStr.size() ;
00072         int* a = new int[s] ;
00073         IntString* pps = new IntString(a , s);
00074         for(int i = 0 ; i < s ; i++){
00075                 if(testIntStr.getElementAt(i)==1 && repIntStr.getElementAt(i) == 1)
00076                 {
00077                         pps->set(i,1);
00078                 }else{
00079                         pps->set(i,0) ;
00080                 }
00081         }
00082         return pps ;
00083 }
00084 // ######################################################################
00085 inline float getAccuracyOfPPS(int d , int p , int n) {
00086 
00087         return ((float)(n+d))/((float)(n+p)) ;
00088 }
00089 // ######################################################################
00090 map<float,float>* getProbabilityDistribution(IntString& tstIntStr , IntString& repIntStr){
00091         map<float , float>* m = new map<float , float>();
00092         int p = tstIntStr.getDegree();
00093         int n = tstIntStr.size() - p ;
00094         IntString* tps = getTPS(tstIntStr,repIntStr) ;
00095         int d = tps->getDegree();
00096         int p_repStr = repIntStr.getDegree() ;
00097         int n_repStr = repIntStr.size() - p_repStr ;
00098 
00099         for(int dp = 0 ; dp <= d ; dp++){
00100                 int powerOfPositiveProbability = p_repStr - dp ;
00101                 float prbOfPositive = ((float)(p-dp))/((float)(p+n-dp)) ;
00102                 float prbOfNegative = ((float)(n))/((float)(p+n-dp)) ;
00103                 //float acc = ((float)(n+dp))/((float)(p+n)) ;
00104                 float acc = ((float)(dp))/((float)(p)) ;
00105                 int numOfPossibledps = getBinomialCoef(d,dp) ;
00106                 float prb = 1.0f ;
00107                 if(prbOfPositive != 0) {
00108                         prb = numOfPossibledps * pow(prbOfPositive,powerOfPositiveProbability)*pow(prbOfNegative,n_repStr) ;
00109                 }else{
00110                         if(powerOfPositiveProbability!=0){prb = 0.0f;}
00111                 }
00112                 (*m)[acc] = prb;
00113         }
00114         normalizeThePDF(*m) ;
00115         return m ;
00116 }
00117 
00118 map<float,float>* getCummulativeProbabilityDistribution(IntString& tstIntStr , IntString& repIntStr){
00119         map<float , float>* pdf = getProbabilityDistribution(tstIntStr,repIntStr) ;
00120         map<float , float>* cdf = new map<float , float>();
00121 
00122         for (map<float,float>::iterator fit = pdf->begin(); fit != pdf->end(); ++fit) {
00123                 float cp = 0.0f ;
00124                 for (map<float,float>::iterator sit = pdf->begin(); sit != pdf->end(); ++sit) {
00125                         if ((sit->first) <= (fit->first)) cp+= sit->second ;
00126                 }
00127                 (*cdf)[fit->first] = cp ;
00128         }
00129         pdf->map::~map() ;
00130         return cdf ;
00131 }
00132 
00133 void normalizeThePDF(map<float,float>& pdf){
00134 
00135         float sum = 0 ;
00136         for (map<float,float>::iterator it = pdf.begin(); it != pdf.end(); ++it) {
00137                 sum += pdf[it->first];
00138             }
00139 
00140         for (map<float,float>::iterator it = pdf.begin(); it != pdf.end(); ++it) {
00141                 pdf[it->first] = pdf[it->first]/sum;
00142             }
00143 }
00144 
00145 inline int getBinomialCoef(int n , int r) {
00146         return factorial(n)/(factorial(r)*factorial(n-r));
00147 }
00148 
00149 inline int factorial(int n) {
00150         if(n==0 || n==1){return 1 ;}else{return n*factorial(n-1);}
00151 }
00152 
00153 float getExpectedValue(map<float , float>& dist){
00154         float avrg = 0 ;
00155         for(map<float , float>::iterator it = dist.begin() ; it != dist.end() ; ++it){
00156                 avrg += (it->first) * (it->second);
00157         }
00158         return avrg ;
00159 }
00160 
00161 float getSTD(std::map<float , float>& dist){
00162         float avrg = getExpectedValue(dist) ;
00163         float std = 0 ;
00164         for(map<float , float>::iterator it = dist.begin() ; it != dist.end() ; ++it){
00165                 std += pow(it->first-avrg,2.0f) * (it->second);
00166         }
00167 
00168         return sqrt(std) ;
00169 }
00170 // ######################################################################
00171 extern "C" int main( int argc, char* args[] ){
00172         cout<<"Hi it\'s working!"<<endl ;
00173         int* a = new int [24] ;
00174         int* b = new int[24] ;
00175         for(int i = 0 ; i < 24 ; i++){
00176                 if (i<7){a[i]=1;}else{a[i]=0;}
00177                 if (i<6){b[i]=1;}else{b[i]=0;}
00178         }
00179         b[11]= 1 ;
00180         b[12] = 1 ;
00181         b[13] = 1;
00182         b[14] = 1 ;
00183         b[15]= 0 ;
00184         IntString* ts = new IntString(a,24) ;
00185         IntString* is = new IntString(b,24) ;
00186         IntString* tps = getTPS(*ts,*is) ;
00187 
00188         cout<<tps->toString()<< " size: "<< tps->size()<<"  degree:"<< tps->getDegree()<<endl ;
00189 
00190         map<float,float>* pdf = getProbabilityDistribution(*ts,*is);
00191         for(map<float,float>::iterator it= pdf->begin() ; it!= pdf->end(); ++it){
00192                 cout<<"a: " <<it->first << "  p = " << it->second <<endl;
00193         }
00194 
00195         map<float,float>* cdf = getCummulativeProbabilityDistribution(*ts,*is) ;
00196         for(map<float,float>::iterator it= cdf->begin() ; it!= cdf->end(); ++it){
00197                 cout<<"a: " <<it->first << "  p = " << it->second <<endl;
00198         }
00199         cout << "expected accuracy = "<<getExpectedValue(*pdf)<< " with std = "<< getSTD(*pdf)<<endl;
00200         return 0 ;
00201 }
00202 
Generated on Sun May 8 08:40:09 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3