72 return( Value * Value );
92 return( floor(0.5 + Value) );
95 double d = pow(10., Decimals);
98 if( fabs(v - floor(v)) > 0. )
100 return( floor(0.5 + v) / d );
109 if( Decimals <= 0 || Value == 0. )
111 return( (
int)(0.5 + Value) );
114 Decimals = (int)(-(ceil(log10(fabs(Value))) - Decimals));
118 double d = pow(10., Decimals);
121 ? -((
int)(0.5 - Value * d)) / d
122 : ((
int)(0.5 + Value * d)) / d
127 double d = pow(10., -Decimals);
130 ? -((
int)(0.5 - Value / d)) * d
131 : ((
int)(0.5 + Value / d)) * d
146 Number = abs(Number);
148 return( Number < 10 ? 1 : 1 + (
int)log10((
double)Number) );
163 if( Width > 0 && Precision >= 0 )
return(
CSG_String::Format(
"%*.*e", Width, Precision, Number) );
171 if( Width > 0 && Precision >= 0 )
return(
CSG_String::Format(
"%*.*f", Width, Precision, Number) );
189 if( *((
int *)a) < *((
int *)b) )
192 if( *((
int *)a) > *((
int *)b) )
201 if( *((
double *)a) < *((
double *)b) )
204 if( *((
double *)a) > *((
double *)b) )
213 return( strcmp((
const char *)a, (
const char *)b) );
226 if( Deg < 0. ) { Min = -fabs(Min); Sec = -fabs(Sec); }
228 return( Deg + Min / 60. + Sec / 3600. );
234 Sec = fmod(Value < 0. ? -Value : Value, 360.);
236 Deg = (int)Sec; Sec = 60. * (Sec - Deg);
237 Min = (int)Sec; Sec = 60. * (Sec - Min);
275 return( 1. * rand() / (
double)RAND_MAX );
283 return( min + (max - min) * rand() / (
double)RAND_MAX );
306 w = x1 * x1 + x2 * x2;
310 w = sqrt((-2. * log(w)) / w);
312 return( mean + stddev * x1 * w );
340 Create(Mean, StdDev, Count);
345 Create(Values, bHoldValues);
430 double Scale = nValues / (double)
m_nValues;
544 m_Sum += Weight * Value;
545 m_Sum2 += Weight * Value*Value;
632 if( Quantile <= 0. ||
m_Values.Get_Size() == 1 )
643 double r = Quantile * (
m_Values.Get_Size() - 1);
711 if(
m_Values.Get_Size() == 0 ) {
return( -1 ); }
716 for(
size_t i=1; i<(size_t)
m_Values.Get_Size(); i++)
725 return( (
sLong)Index );
735 if(
m_Values.Get_Size() == 0 ) {
return( -1 ); }
740 for(
size_t i=1; i<(size_t)
m_Values.Get_Size(); i++)
749 return( (
sLong)Index );
759 if(
m_Values.Get_Size() == 0 ) {
return( -1 ); }
781 if(
m_Values.Get_Size() == 0 ) {
return( -1 ); }
878 if( Value == m_Value[i] )
892 m_Value.Add_Row(Value);
905 if( Value == m_Value[i] )
933 if( Value.
Cmp(m_Value[i]) == 0 )
960 if( Value.
Cmp(m_Value[i]) == 0 )
995 m_pTable->Add_Field(
"VALUE", Type);
1002 m_pTable->Del_Records();
1008 return( m_pTable->Get_Field_Type(0) );
1021 return( pRecord ? (
int)pRecord->
Get_Index() : -1);
1029 return( pRecord ? (
int)pRecord->
Get_Index() : -1);
1037 return( pRecord ? (
int)pRecord->
Get_Index() : -1);
1052 (pRecord = m_pTable->Add_Record())->Set_Value(0, Value);
1054 if( m_pTable->Get_Count() > 16 || m_pTable->is_Indexed() )
1062 return( (
int)(m_pTable->Get_Count() - 1) );
1072 (pRecord = m_pTable->Add_Record())->Set_Value(0, Value);
1074 if( m_pTable->Get_Count() > 16 || m_pTable->is_Indexed() )
1082 return( (
int)(m_pTable->Get_Count() - 1) );
1092 (pRecord = m_pTable->Add_Record())->Set_Value(0, Value);
1094 if( m_pTable->Get_Count() > 16 || m_pTable->is_Indexed() )
1102 return( (
int)(m_pTable->Get_Count() - 1) );
1113 for(
sLong i=0; i<m_pTable->Get_Count(); i++)
1133 return( (
int)m_pTable->Get_Count() );
1142 return( pRecord ? pRecord->
asInt(1) : 0 );
1150 return( pRecord ? pRecord->
asInt(0) : 0 );
1158 return( pRecord ? pRecord->
asDouble(0) : 0 );
1177 if( m_pTable->Get_Count() > 0 )
1179 int Index = 0, Count = m_pTable->Get_Record_byIndex(0)->asInt(1);
1181 for(
int i=1; i<m_pTable->Get_Count(); i++)
1183 if( Count < m_pTable->Get_Record_byIndex(i)->
asInt(1) )
1185 Index = i; Count = m_pTable->Get_Record_byIndex(i)->asInt(1);
1198 if( m_pTable->Get_Count() > 0 )
1200 int Index = 0, Count = m_pTable->Get_Record_byIndex(0)->asInt(1);
1202 for(
int i=1; i<m_pTable->Get_Count(); i++)
1204 if( Count > m_pTable->Get_Record_byIndex(i)->asInt(1) )
1206 Index = i; Count = m_pTable->Get_Record_byIndex(i)->asInt(1);
1286 m_Statistics.Create();
1302void CSG_Histogram::_On_Construction(
void)
1306 m_Cumulative = NULL;
1313bool CSG_Histogram::_Create(
size_t nClasses,
double Minimum,
double Maximum)
1319 m_Elements = (
size_t *)
SG_Calloc(nClasses,
sizeof(
size_t));
1320 m_Cumulative = (
size_t *)
SG_Calloc(nClasses,
sizeof(
size_t));
1322 if( m_Elements && m_Cumulative )
1324 m_nClasses = nClasses;
1341 m_Statistics += Value;
1343 if( m_nClasses > 0 && m_Minimum <= Value && Value <= m_Maximum )
1345 size_t Class = (size_t)((Value - m_Minimum) / m_ClassWidth);
1347 if( Class >= m_nClasses )
1349 Class = m_nClasses - 1;
1352 m_Elements[Class]++;
1359 if( m_nClasses > 0 && Scale > 0. )
1363 for(
size_t i=0; i<m_nClasses; i++)
1365 m_Elements[i] = (size_t)(Scale * m_Elements[i]);
1377 if( m_nClasses > 0 )
1379 m_Statistics.Get_Mean();
1381 m_nMaximum = m_Cumulative[0] = m_Elements[0];
1383 for(
size_t i=1; i<m_nClasses; i++)
1385 m_Cumulative[i] = m_Cumulative[i - 1] + m_Elements[i];
1387 if( m_nMaximum < m_Elements[i] )
1389 m_nMaximum = m_Elements[i];
1400bool CSG_Histogram::_Update(
sLong nElements)
1402 if( nElements > 0 && m_Statistics.
Get_Count() > 0 )
1404 double Scale = (double)nElements / (
double)m_Statistics.
Get_Count();
1408 for(
size_t i=1; i<m_nClasses; i++)
1410 m_Elements[i] = (size_t)(0.5 + Scale * m_Elements[i]);
1420 || m_nClasses != Histogram.m_nClasses
1421 || m_Minimum != Histogram.m_Minimum
1422 || m_Maximum != Histogram.m_Maximum )
1427 m_Statistics += Histogram.m_Statistics;
1429 for(
size_t i=0; i<m_nClasses; i++ )
1431 m_Elements[i] += Histogram.m_Elements[i];
1443 if( m_nClasses < 2 ) {
return( 0. ); }
1445 if( Quantile <= 0. ) {
return( m_Minimum ); }
1446 if( Quantile >= 1. ) {
return( m_Maximum ); }
1450 for(
size_t i=0, n0=0; i<m_nClasses; n0=m_Cumulative[i++])
1452 if( n < m_Cumulative[i] )
1454 if( m_Cumulative[i] >= n0 )
1459 double d = (n - n0) / (
double)(m_Cumulative[i] - n0);
1461 return(
Get_Break(i) + d * m_ClassWidth );
1463 else if( n == m_Cumulative[i] )
1469 return( m_Maximum );
1487 if( m_nClasses < 2 ) {
return( 0. ); }
1489 if( Value <= m_Minimum ) {
return( 0. ); }
1490 if( Value >= m_Maximum ) {
return( 1. ); }
1492 size_t Class = (size_t)(m_nClasses * (Value - m_Minimum) / (m_Maximum - m_Minimum));
1494 if( Class >= m_nClasses )
1503 return( dq * (Value - m_Minimum) / m_ClassWidth );
1509 return( q0 + dq * (Value -
Get_Break(Class)) / m_ClassWidth );
1529 if( !_Create(Histogram.m_nClasses, Histogram.m_Minimum, Histogram.m_Maximum) )
1534 m_Statistics = Histogram.m_Statistics;
1535 m_ClassWidth = Histogram.m_ClassWidth;
1536 m_nMaximum = Histogram.m_nMaximum ;
1538 for(
size_t i=0; i<m_nClasses; i++)
1540 m_Cumulative[i] = Histogram.m_Cumulative[i];
1541 m_Elements [i] = Histogram.m_Elements [i];
1570 if( maxSamples > 0 && maxSamples < (
size_t)Values.
Get_N() )
1572 double d = (double)Values.
Get_N() / (double)maxSamples;
1574 for(
double i=0; i<(double)Values.
Get_N(); i+=d)
1579 d = (double)m_Statistics.Get_Count() / (double)maxSamples;
1581 return( _Update(d < 1. ? (
int)(d * (
double)Values.
Get_N()) : Values.
Get_N()) );
1585 for(
int i=0; i<Values.
Get_N(); i++)
1596 if( !pTable || Field < 0 || Field >= pTable->
Get_Field_Count() || !_Create(nClasses,
1604 if( maxSamples > 0 && maxSamples < (
size_t)pTable->
Get_Count() )
1606 double Value, Dividend, d = (double)pTable->
Get_Count() / (double)maxSamples;
1608 for(
double i=0; i<(double)pTable->
Get_Count(); i+=d)
1616 else if( pTable->
Get_Value((
sLong)i, Normalize, Dividend) && Dividend != 0. )
1623 d = (double)m_Statistics.Get_Count() / (double)maxSamples;
1631 double Value, Dividend;
1633 if( pTable->
Get_Value(i, Field, Value) )
1639 else if( pTable->
Get_Value((
sLong)i, Normalize, Dividend) && Dividend != 0. )
1652 if( !pGrid || !_Create(nClasses,
1660 if( maxSamples > 0 && (
sLong)maxSamples < pGrid->Get_NCells() )
1662 double d = (double)pGrid->
Get_NCells() / (double)maxSamples;
1664 for(
double i=0; i<(double)pGrid->
Get_NCells(); i+=d)
1672 d = (double)m_Statistics.Get_Count() / (double)maxSamples;
1692 if( !pGrids || !_Create(nClasses,
1700 if( maxSamples > 0 && (
sLong)maxSamples < pGrids->Get_NCells() )
1702 double d = (double)pGrids->
Get_NCells() / (double)maxSamples;
1704 for(
double i=0; i<(double)pGrids->
Get_NCells(); i+=d)
1712 d = (double)m_Statistics.Get_Count() / (double)maxSamples;
1799 if( LogScale >= 0. )
1973 Create(pTable, Field, nClasses, Histogram);
1979 Create(pGrid, nClasses, Histogram);
1985 Create(pGrids, nClasses, Histogram);
1991 Create(Values, nClasses, Histogram);
2002 bool bResult =
false;
2006 bResult = m_Histogram.Create(Histogram, pTable, Field) && _Histogram(nClasses);
2008 else if( Field >= 0 && Field < pTable->Get_Field_Count() )
2014 if( pTable->
Get_Value(i, Field, Value) )
2016 m_Values.Add_Row(Value);
2020 bResult = m_Values.Sort() && _Calculate(nClasses);
2031 bool bResult =
false;
2035 bResult = m_Histogram.Create(Histogram, pGrid) && _Histogram(nClasses);
2043 m_Values.Add_Row(pGrid->
asDouble(i));
2047 bResult = m_Values.Sort() && _Calculate(nClasses);
2058 bool bResult =
false;
2062 bResult = m_Histogram.Create(Histogram, pGrids) && _Histogram(nClasses);
2070 m_Values.Add_Row(pGrids->
asDouble(i));
2074 bResult = m_Values.Sort() && _Calculate(nClasses);
2085 bool bResult =
false;
2089 bResult = m_Histogram.Create(Histogram, Values) && _Histogram(nClasses);
2093 bResult = m_Values.Create(Values) && m_Values.Sort() && _Calculate(nClasses);
2107bool CSG_Natural_Breaks::_Histogram(
int nClasses)
2109 if( _Calculate(nClasses) )
2117 m_Breaks[i] = m_Histogram.
Get_Value(m_Breaks[i] * d);
2120 m_Breaks[nClasses] = m_Histogram.Get_Break((
int)m_Histogram.Get_Class_Count());
2122 m_Histogram.Destroy();
2127 m_Histogram.Destroy();
2133inline double CSG_Natural_Breaks::_Get_Value(
int i)
2135 if( m_Histogram.Get_Class_Count() > 0 )
2137 return( (
double)m_Histogram.Get_Cumulative(i) );
2140 return( m_Values[i] );
2144bool CSG_Natural_Breaks::_Calculate(
int nClasses)
2146 if( m_Histogram.Get_Class_Count() == 0 && m_Values.Get_Size() == 0 )
2151 int nValues = m_Histogram.Get_Class_Count() > 0 ? (int)m_Histogram.Get_Class_Count() : m_Values.Get_N();
2153 CSG_Matrix mv(nClasses, nValues); mv.Assign(FLT_MAX);
2155 int **mc = (
int **)
SG_Malloc(nValues *
sizeof(
int *));
2157 mc[0] = (
int *)
SG_Calloc((
size_t)nClasses * nValues,
sizeof(
int));
2159 for(
int i=0; i<nValues; i++)
2161 mc[i] = mc[0] + i * (size_t)nClasses;
2165 for(
int i=1; i<nValues; i++)
2167 double v = 0., s1 = 0., s2 = 0., w = 0.;
2169 for(
int m=0, n=i+1; m<=i; m++, n--)
2175 v = s2 - (s1 * s1) / w;
2179 for(
int j=1; j<nClasses; j++)
2181 if( mv[i][j] >= (v + mv[n - 1][j - 1]) )
2184 mv[i][j] = v + mv[n - 1][j - 1];
2195 CSG_Array_Int Class(nClasses);
2197 for(
int i=0; i<nClasses; i++)
2202 int j = Class[(size_t)nClasses - 1] = nValues - 1;
2204 for(
int i=nClasses-1; i>0; i--)
2206 Class[(size_t)i - 1] = j = mc[j - 1][i];
2210 m_Breaks.Create((
size_t)nClasses + 1);
2212 m_Breaks[0] = _Get_Value(0);
2214 for(
int i=1; i<nClasses; i++)
2216 m_Breaks[i] = _Get_Value(Class[i - 1]);
2219 m_Breaks[nClasses] = _Get_Value(nValues - 1);
2249 m_Centroid.Destroy();
2250 m_Variance.Destroy();
2251 m_nMembers.Destroy();
2252 m_Clusters.Destroy();
2253 m_Features.Destroy();
2267 m_nFeatures = nFeatures;
2280 return( m_nFeatures > 0 && m_Features.Inc_Array() );
2286 if( iElement >= 0 && iElement <
Get_nElements() && iFeature >= 0 && iFeature < m_nFeatures )
2288 ((
double *)m_Features.Get_Entry(iElement))[iFeature] = Value;
2315 m_nMembers.Create(nClusters);
2316 m_Variance.Create(nClusters);
2317 m_Centroid.Create(m_nFeatures, nClusters);
2321 bool bResult =
true;
2323 if( nClusters == 1 )
2327 m_Clusters[iElement] = 0;
2336 switch( Initialization )
2341 m_Clusters[iElement] = nClusters - 1;
2347 m_Clusters[iElement] = iElement % nClusters;
2352 if( 0 > m_Clusters[iElement] || m_Clusters[iElement] >= nClusters )
2354 m_Clusters[iElement] = iElement % nClusters;
2365 default: bResult = _Minimum_Distance(
true , nMaxIterations);
break;
2366 case 1: bResult = _Hill_Climbing (
true , nMaxIterations);
break;
2367 case 2: bResult = _Minimum_Distance(
true , nMaxIterations)
2368 && _Hill_Climbing (
false, nMaxIterations);
break;
2379 int iCluster = m_Clusters[iElement];
double d = 0., *Feature = (
double *)m_Features.Get_Entry(iElement);
2381 for(
int iFeature=0; iFeature<m_nFeatures; iFeature++)
2383 d +=
SG_Get_Square(Feature[iFeature] - m_Centroid[iCluster][iFeature]);
2386 m_Inertia += sqrt(d);
2394 for(
int iCluster=0; iCluster<nClusters; iCluster++)
2396 m_WCSS += m_Variance[iCluster];
2398 m_Variance[iCluster] = m_nMembers[iCluster] <= 0 ? 0. : m_Variance[iCluster] / m_nMembers[iCluster];
2406bool CSG_Cluster_Analysis::_Update_Clusters(
void)
2408 m_nMembers = 0; m_Centroid = 0.; m_Variance = 0.;
2412 int iCluster = m_Clusters[iElement]; m_nMembers[iCluster]++;
2414 double *Feature = (
double *)m_Features.
Get_Entry(iElement);
2416 for(
int iFeature=0; iFeature<m_nFeatures; iFeature++)
2418 double d = Feature[iFeature];
2420 m_Centroid[iCluster][iFeature] += d; m_Variance[iCluster] += d*d;
2427 double v = 0., d = m_nMembers[iCluster] < 1 ? 0. : 1. / (double)m_nMembers[iCluster];
2429 for(
int iFeature=0; iFeature<m_nFeatures; iFeature++)
2431 m_Centroid[iCluster][iFeature] *= d; v +=
SG_Get_Square(m_Centroid[iCluster][iFeature]);
2434 m_Variance[iCluster] -= v * m_nMembers[iCluster];
2441bool CSG_Cluster_Analysis::_Minimum_Distance(
bool bInitialize,
int nMaxIterations)
2443 double SP_Last = -1.;
2449 int nShifts = 0; m_SP = 0.;
2453 double *Feature = (
double *)m_Features.Get_Entry(iElement);
2455 double minVariance = -1.;
2456 int minCluster = -1;
2460 double Variance = 0.;
2462 for(
int iFeature=0; iFeature<m_nFeatures; iFeature++)
2464 Variance +=
SG_Get_Square(m_Centroid[iCluster][iFeature] - Feature[iFeature]);
2467 if( minVariance < 0. || Variance < minVariance )
2469 minVariance = Variance;
2470 minCluster = iCluster;
2474 if( m_Clusters[iElement] != minCluster )
2476 m_Clusters[iElement] = minCluster;
2481 m_SP += minVariance;
2482 m_Variance[minCluster] += minVariance;
2489 _TL(
"pass" ), m_Iteration,
2490 _TL(
"change"), m_Iteration < 2 ? m_SP : SP_Last - m_SP
2495 if( nShifts == 0 || (nMaxIterations > 0 && nMaxIterations <= m_Iteration) )
2510bool CSG_Cluster_Analysis::_Hill_Climbing(
bool bInitialize,
int nMaxIterations)
2515 double SP_Last = -1.;
2523 int iCluster = m_Clusters[iElement];
2525 if( m_nMembers[iCluster] > 1 )
2527 double Variance = 0., *Feature = (
double *)m_Features.Get_Entry(iElement);
2529 for(
int iFeature=0; iFeature<m_nFeatures; iFeature++)
2531 Variance +=
SG_Get_Square(m_Centroid[iCluster][iFeature] - Feature[iFeature]);
2534 double V1 = Variance * m_nMembers[iCluster] / (m_nMembers[iCluster] - 1.);
2537 int kCluster = 0;
double VMin = -1.;
2541 if( jCluster != iCluster )
2545 for(
int iFeature=0; iFeature<m_nFeatures; iFeature++)
2547 Variance +=
SG_Get_Square(m_Centroid[jCluster][iFeature] - Feature[iFeature]);
2550 double V2 = Variance * m_nMembers[jCluster] / (m_nMembers[jCluster] + 1.);
2552 if( VMin < 0. || V2 < VMin )
2555 kCluster = jCluster;
2561 if( VMin >= 0 && VMin < V1 )
2563 m_Variance[iCluster] -= V1;
2564 m_Variance[kCluster] += VMin;
2565 V1 = 1. / (m_nMembers[iCluster] - 1.);
2566 double V2 = 1. / (m_nMembers[kCluster] + 1.);
2568 for(
int iFeature=0; iFeature<m_nFeatures; iFeature++)
2570 double d = Feature[iFeature];
2572 m_Centroid[iCluster][iFeature] = (m_nMembers[iCluster] * m_Centroid[iCluster][iFeature] - d) * V1;
2573 m_Centroid[kCluster][iFeature] = (m_nMembers[kCluster] * m_Centroid[kCluster][iFeature] + d) * V2;
2576 m_Clusters[iElement] = kCluster;
2578 m_nMembers[iCluster]--;
2579 m_nMembers[kCluster]++;
2591 m_SP += m_Variance[iCluster];
2597 _TL(
"pass" ), m_Iteration,
2598 _TL(
"change"), m_Iteration <= 1 ? m_SP : SP_Last - m_SP
2603 if( nShifts == 0 || (nMaxIterations > 0 && nMaxIterations <= m_Iteration) )
2622 m_nFeatures = 0; m_pClasses = NULL; m_nClasses = 0;
2624 m_Threshold_Distance = 0.;
2625 m_Threshold_Angle = 0.;
2626 m_Threshold_Probability = 0.;
2627 m_Probability_Relative =
false;
2651 m_nFeatures = nFeatures;
2658 if( m_nClasses > 0 )
2660 for(
int i=0; i<m_nClasses; i++)
2662 delete(m_pClasses[i]);
2699 m_bWTA[Method] = bOn;
2719 int nFeatures = m_nFeatures;
Destroy(); m_nFeatures = nFeatures;
2729 if( !Data(
"classes") || !Data(
"features") || !Data[
"features"](
"count") || Data[
"features"][
"count"].Get_Content().asInt() != m_nFeatures || m_nFeatures == 0 )
2734 if( Data[
"features"](
"info") )
2744 if( Classes[i].Cmp_Name(
"class") && Classes[i].Get_Child(
"id") )
2748 CClass *pClass =
new CClass(Classes[i][
"id"].Get_Content());
2762 m_pClasses = (CClass **)
SG_Realloc(m_pClasses, ((
size_t)m_nClasses + 1) *
sizeof(CClass *));
2763 m_pClasses[m_nClasses++] = pClass;
2773 return( m_nClasses > 0 );
2779 if( m_nFeatures < 1 || m_nClasses < 1 || File.
is_Empty() )
2786 Data.
Set_Name (
"supervised_classifier");
2791 Features.
Add_Child(
"count", m_nFeatures);
2793 if( Feature_Info && *Feature_Info )
2795 Features.
Add_Child(
"info", Feature_Info);
2802 for(
int i=0; i<m_nClasses; i++)
2806 CClass *pClass = m_pClasses[i];
2815 return( Data.
Save(File) );
2828 if( m_nFeatures > 0 && m_nClasses > 0 )
2832 for(
int iClass=0; iClass<m_nClasses; iClass++)
2834 CClass *pClass = m_pClasses[iClass];
2836 s +=
"\n____\n" + pClass->m_ID +
"\nFeature\tMean\tMin\tMax\tStdDev";
2838 for(
int i=0; i<m_nFeatures; i++)
2862 if( m_nFeatures < 1 || Mean.
Get_N() != m_nFeatures || Min.
Get_N() != m_nFeatures || Max.
Get_N() != m_nFeatures || Cov.
Get_NCols() != m_nFeatures || Cov.
Get_NRows() != m_nFeatures )
2867 CClass *pClass, **pClasses = (CClass **)
SG_Realloc(m_pClasses, ((
size_t)m_nClasses + 1) *
sizeof(CClass *));
2871 m_pClasses = pClasses;
2873 m_pClasses[m_nClasses++] = pClass =
new CClass(Class_ID);
2875 pClass->m_ID = Class_ID;
2876 pClass->m_Mean = Mean;
2877 pClass->m_Min = Min;
2878 pClass->m_Max = Max;
2879 pClass->m_Cov = Cov;
2899 for(
int i=0; i<m_nClasses; i++)
2901 m_pClasses[i]->m_Samples.Destroy();
2910 if( m_nFeatures > 0 && m_nFeatures == Features.
Get_N() )
2916 CClass **pClasses = (CClass **)
SG_Realloc(m_pClasses, ((
size_t)m_nClasses + 1) *
sizeof(CClass *));
2920 m_pClasses = pClasses;
2922 m_pClasses[iClass = m_nClasses++] =
new CClass(Class_ID);
2928 return( m_pClasses[iClass]->m_Samples.Add_Row(Features) );
2938 if( m_nFeatures < 1 || m_nClasses < 1 )
2943 for(
int iClass=0; iClass<m_nClasses; iClass++)
2945 if( !m_pClasses[iClass]->
Train() )
2951 if( bClear_Samples )
2965bool CSG_Classifier_Supervised::CClass::Train(
void)
2973 m_Mean.
Create(m_Samples.Get_NCols());
2974 m_Min .Create(m_Samples.Get_NCols());
2975 m_Max .Create(m_Samples.Get_NCols());
2977 for(
int iFeature=0; iFeature<m_Samples.Get_NCols(); iFeature++)
2979 CSG_Simple_Statistics s;
2981 for(
int iSample=0; iSample<m_Samples.Get_NRows(); iSample++)
2983 s += m_Samples[iSample][iFeature];
2992 m_Cov.Create(m_Samples.Get_NCols(), m_Samples.Get_NCols());
2994 for(
int iFeature=0; iFeature<m_Samples.Get_NCols(); iFeature++)
2996 for(
int jFeature=iFeature; jFeature<m_Samples.Get_NCols(); jFeature++)
3000 for(
int iSample=0; iSample<m_Samples.Get_NRows(); iSample++)
3002 cov += (m_Samples[iSample][iFeature] - m_Mean[iFeature]) * (m_Samples[iSample][jFeature] - m_Mean[jFeature]);
3005 if( m_Samples.Get_NRows() > 1 )
3007 cov /= m_Samples.Get_NRows() - 1;
3010 m_Cov[iFeature][jFeature] = m_Cov[jFeature][iFeature] = cov;
3014 m_Cov_Inv = m_Cov.Get_Inverse ();
3015 m_Cov_Det = m_Cov.Get_Determinant();
3017 m_Mean_Spectral = CSG_Simple_Statistics(m_Mean).Get_Mean();
3031 if( m_nFeatures > 0 )
3048 Class = -1; Quality = 0.;
3064 return( Class >= 0 );
3123void CSG_Classifier_Supervised::_Get_Binary_Encoding(
const CSG_Vector &Features,
int &Class,
double &Quality)
3127 CClass *pClass = m_pClasses[iClass];
3135 d += (Features(iFeature) < Mean_Spectral) == (pClass->m_Mean[iFeature] < pClass->m_Mean_Spectral) ? 0 : 1;
3139 d += (Features[iFeature ] < Features[iFeature + 1]) == (pClass->m_Mean[iFeature ] < pClass->m_Mean[iFeature + 1]) ? 0 : 1;
3143 d += (Features[iFeature - 1] < Features[iFeature ]) == (pClass->m_Mean[iFeature - 1] < pClass->m_Mean[iFeature ]) ? 0 : 1;
3147 d += (Features[iFeature - 1] < Features[iFeature + 1]) == (pClass->m_Mean[iFeature - 1] < pClass->m_Mean[iFeature + 1]) ? 0 : 1;
3151 if( Class < 0 || Quality > d )
3153 Class = iClass; Quality = d;
3159void CSG_Classifier_Supervised::_Get_Parallel_Epiped(
const CSG_Vector &Features,
int &Class,
double &Quality)
3163 CClass *pClass = m_pClasses[iClass];
3165 bool bMember =
true;
3169 bMember = pClass->m_Min[iFeature] <= Features[iFeature] && Features[iFeature] <= pClass->m_Max[iFeature];
3174 Class = iClass; Quality++;
3180void CSG_Classifier_Supervised::_Get_Minimum_Distance(
const CSG_Vector &Features,
int &Class,
double &Quality)
3184 CClass *pClass = m_pClasses[iClass];
3186 double Distance = (Features - pClass->m_Mean).Get_Length();
3188 if( Class < 0 || Quality > Distance )
3190 Class = iClass; Quality = Distance;
3194 if( m_Threshold_Distance > 0. && Quality > m_Threshold_Distance )
3201void CSG_Classifier_Supervised::_Get_Mahalanobis_Distance(
const CSG_Vector &Features,
int &Class,
double &Quality)
3205 CClass *pClass = m_pClasses[iClass];
3207 CSG_Vector D = Features - pClass->m_Mean;
3209 double Distance = D * (pClass->m_Cov_Inv * D);
3211 if( Class < 0 || Quality > Distance )
3213 Class = iClass; Quality = Distance;
3217 if( m_Threshold_Distance > 0. && Quality > m_Threshold_Distance )
3224void CSG_Classifier_Supervised::_Get_Maximum_Likelihood(
const CSG_Vector &Features,
int &Class,
double &Quality)
3230 CClass *pClass = m_pClasses[iClass];
3232 CSG_Vector D = Features - pClass->m_Mean;
3234 double Distance = D * (pClass->m_Cov_Inv * D);
3236 double Probability = pow(2. *
M_PI, -0.5 * m_nFeatures) * pow(pClass->m_Cov_Det, -0.5) * exp(-0.5 * Distance);
3239 dSum += Probability;
3241 if( Class < 0 || Quality < Probability )
3243 Class = iClass; Quality = Probability;
3249 if( m_Probability_Relative )
3251 Quality = 100. * Quality / dSum;
3254 if( m_Threshold_Probability > 0. && Quality < m_Threshold_Probability )
3262void CSG_Classifier_Supervised::_Get_Spectral_Angle_Mapping(
const CSG_Vector &Features,
int &Class,
double &Quality)
3266 CClass *pClass = m_pClasses[iClass];
3268 double Angle = Features.
Get_Angle(pClass->m_Mean);
3270 if( Class < 0 || Quality > Angle )
3272 Class = iClass; Quality = Angle;
3278 if( m_Threshold_Angle > 0. && Quality > m_Threshold_Angle )
3285void CSG_Classifier_Supervised::_Get_Spectral_Divergence(
const CSG_Vector &Features,
int &Class,
double &Quality)
3290void CSG_Classifier_Supervised::_Get_Winner_Takes_All(
const CSG_Vector &Features,
int &Class,
double &Quality)
3296 int iClass;
double iQuality;
3298 if( m_bWTA[iMethod] &&
Get_Class(Features, iClass, iQuality, iMethod) && ++Votes[iClass] > Quality )
3300 Class = iClass; Quality = Votes[iClass];
3323 if( !T || !df || df < 1. )
3336 if( p <= 0. || p >= 1. || df < 1 )
3342 double t = 0, p0, p1, diff = 1.;
3346 while( fabs(diff) > 0.0001 )
3348 t = Get_T_Inv(p1, df);
3349 diff = Get_T_P(t, df) - p0;
3353 return( bNegative ? -t : t );
3386 const double a1 = 0.0000053830, a2 = 0.0000488906, a3 = 0.0000380036;
3387 const double a4 = 0.0032776263, a5 = 0.0211410061, a6 = 0.0498673470;
3391 double p = (((((a1 * z + a2) * z + a3) * z + a4) * z + a5) * z + a6) * z + 1.;
3393 return( pow(p, -16) );
3399 const double a0 = 2.5066282, a1 = -18.6150006, a2 = 41.3911977, a3 = -25.4410605;
3400 const double b1 = -8.4735109, b2 = 23.0833674, b3 = -21.0622410, b4 = 3.1308291;
3401 const double c0 = -2.7871893, c1 = -2.2979648, c2 = 4.8501413, c3 = 2.3212128;
3402 const double d1 = 3.5438892, d2 = 1.6370678;
3406 double r = sqrt(-log(0.5 - p));
3408 return( (((c3 * r + c2) * r + c1) * r + c0) / ((d2 * r + d1) * r + 1.) );
3414 return( p * (((a3 * r + a2) * r + a1) * r + a0) / ((((b4 * r + b3) * r + b2) * r + b1) * r + 1.) );
3419double CSG_Test_Distribution::Get_T_P(
double T,
int df)
3421 return( df == 1 ? 1. - 2. * atan(fabs(T)) /
M_PI
3422 : df == 2 ? 1. - fabs(T) / sqrt(T*T + 2.)
3423 : df == 3 ? 1. - 2. * (atan(fabs(T) / sqrt(3.)) + fabs(T) * sqrt(3.) / (T*T + 3.)) /
M_PI
3424 : df == 4 ? 1. - fabs(T) * (1. + 2. / (T*T + 4.)) / sqrt(T*T + 4.)
3425 : Get_Norm_P(Get_T_Z(fabs(T), df))
3430double CSG_Test_Distribution::Get_T_Z(
double T,
int df)
3434 double A9, B9, T9, Z8, P7, B7, z;
3441 : A9 * (((1. - T9 * 0.75) * T9 / 3. - 0.5) * T9 + 1.) * T9;
3442 P7 = ((0.4 * Z8 + 3.3) * Z8 + 24.) * Z8 + 85.5;
3443 B7 = 0.8 * pow(Z8, 2.) + 100. + B9;
3444 z = (1. + (-P7 / B7 + Z8 + 3.) / B9) * sqrt(Z8);
3450double CSG_Test_Distribution::Get_T_Inv(
double p,
int df)
3456 return( cos(p *
M_PI / 2.) / sin(p *
M_PI / 2.) );
3461 return( sqrt(2. / (p * (2. - p)) - 2.) );
3464 double a = 1. / (df - 0.5);
3465 double b = 48. / (a*a);
3466 double c = ((20700. * a / b - 98.) * a - 16.) * a + 96.36;
3467 double d = ((94.5 / (b + c) - 3.) / b + 1.) * sqrt(a *
M_PI / 2.) * df;
3469 double y = pow(x, 2. / df);
3473 x = Get_Norm_Z(0.5 * (1. - p));
3478 c = c + 0.3 * (df - 4.5) * (x + 0.6);
3481 c = (((0.05 * d * x - 5) * x - 7.) * x - 2.) * x + b + c;
3482 y = (((((0.4 * y + 6.3) * y + 36.) * y + 94.5) / c - y - 3.) / b + 1.) * x;
3496 y = ((1. / (((df + 6.) / (df * y) - 0.089 * d - 0.822) * (df + 2.) * 3.)
3497 + 0.5 / (df + 4.)) * y - 1.) * (df + 1.) / (df + 2.) + 1. / y;
3500 return( sqrt(df * y) );
3511 double F = ((
sLong)nSamples - (
sLong)nPredictors - 1) * (R2 / nPredictors) / (1. - R2);
3523 if( F >= 0.00001 && dfn > 0 && dfd > 0 )
3525 if( F * dfn >= dfd || F > 1. + 20. / dfn + 10. / sqrt((
double)dfn) )
3527 p = Get_Gamma(F, dfn, dfd);
3531 p = 1. - Get_Gamma(1. / F, dfd, dfn);
3535 if( p <= 0. || p >= 1. )
3537 p = F > 1. ? 0. : F < 1. ? 1. : 0.5;
3546 if( alpha < 0. || alpha > 1. || dfd < 0 || dfn < 0 )
3556 const int ITERMAX = 100;
3557 const double EPSILON = 0.0001;
3560 double lo, hi, mid, p;
3567 for(i=0; i<ITERMAX; i++)
3592 for(i=0; i<ITERMAX; i++)
3613 mid = (hi + lo) / 2.;
3615 for(i=0; i<ITERMAX && (hi-lo)>
EPSILON*mid; i++)
3617 mid = (hi + lo) / 2.;
3622 else if( p > alpha )
3632double CSG_Test_Distribution::Get_Gamma(
double F,
double dfn,
double dfd)
3636 const double EXPMIN = -30.;
3637 const double SMALL = 0.00000000001;
3639 double x, c, er, s, n, t1, t;
3644 x = dfd / (dfd + dfn * F);
3645 c = Get_Log_Gamma(dfn + dfd) - Get_Log_Gamma(dfn) - Get_Log_Gamma(dfd + 1.) + dfd * log(x) + dfn * log(1. - x);
3661 while( t > er || t > t1 )
3665 t *= ((dfn + n) * x / (dfd + n));
3673double CSG_Test_Distribution::Get_Log_Gamma(
double a)
3677 const int ARGMIN = 6;
3679 const double HL2PI = 0.91893853320467275;
3681 int n = (int)floor(ARGMIN - a + 0.0001);
3691 g = (1. - g * (1. / 30. - g * (1. / 105. - g * (1. / 140. - g / 99.)))) / (12. * a);
3692 g = g + ((a - 0.5) * log(a) - a + HL2PI);
3694 for(
int i=0; i<n; i++)
3713 int nVariables = Values.
Get_NX();
3714 int nSamples = Values.
Get_NY();
3721 C.Create(nVariables, nVariables);
3726 for(j=0; j<nVariables; j++)
3728 for(i=0; i<nSamples; i++)
3730 S[j] += Values[i][j];
3735 for(k=0; k<nVariables; k++)
3737 for(j=k; j<nVariables; j++)
3741 for(i=0; i<nSamples; i++)
3743 cov += (Values[i][j] - S[j].
Get_Mean()) * (Values[i][k] - S[k].
Get_Mean());
3750 cov /= (S[j].
Get_StdDev() * S[k].Get_StdDev());
3753 C[j][k] =
C[k][j] = cov;
bool SG_UI_Process_Get_Okay(bool bBlink)
void SG_UI_StatusBar_Set_Text(const CSG_String &Text)
SAGA_API_DLL_EXPORT void * SG_Malloc(size_t size)
SAGA_API_DLL_EXPORT void SG_Free(void *memblock)
SAGA_API_DLL_EXPORT void * SG_Realloc(void *memblock, size_t size)
SAGA_API_DLL_EXPORT void * SG_Calloc(size_t num, size_t size)
#define SG_FREE_SAFE(PTR)
SAGA_API_DLL_EXPORT CSG_String SG_Get_String(double Value, int Precision=-99)
sLong Get_Size(void) const
void * Get_Entry(sLong Index) const
Returns a pointer to the memory address of the requested variable. You have to type cast and derefere...
void Create(TSG_Data_Type Type=SG_DATATYPE_String)
virtual ~CSG_Category_Statistics(void)
int Get_Category(int Value) const
int asInt(int iCategory) const
double asDouble(int iCategory) const
int Get_Count(void) const
CSG_Category_Statistics(TSG_Data_Type Type=SG_DATATYPE_String)
CSG_String asString(int iCategory) const
TSG_Data_Type Get_Category_Type(void) const
void Set_Probability_Relative(bool Value)
virtual ~CSG_Classifier_Supervised(void)
void Set_Threshold_Distance(double Value)
CSG_Classifier_Supervised(void)
double Get_Threshold_Probability(void)
void Create(int nFeatures)
int Get_Class_Count(void)
int Get_Feature_Count(void)
bool Add_Class(const CSG_String &Class_ID, const CSG_Vector &Mean, const CSG_Vector &Min, const CSG_Vector &Max, const CSG_Matrix &Cov)
void Set_Threshold_Probability(double Value)
bool Get_Probability_Relative(void)
bool Train(bool bClr_Samples=false)
const CSG_String & Get_Class_ID(int iClass)
void Set_Threshold_Angle(double Value)
bool Train_Add_Sample(const CSG_String &Class_ID, const CSG_Vector &Features)
double Get_Threshold_Distance(void)
static CSG_String Get_Name_of_Quality(int Method)
int Get_Class(const CSG_String &Class_ID)
void Set_WTA(int Method, bool bOn)
bool Train_Clr_Samples(void)
bool Save(const CSG_String &File, const SG_Char *Feature_Info=NULL)
static CSG_String Get_Name_of_Method(int Method)
bool Load(const CSG_String &File)
double Get_Threshold_Angle(void)
bool Create(int nFeatures)
int Get_nClusters(void) const
bool Execute(int Method, int nClusters, int nMaxIterations=0, int Initialization=0)
bool Set_Feature(sLong iElement, int iFeature, double Value)
sLong Get_nElements(void) const
virtual ~CSG_Cluster_Analysis(void)
CSG_Cluster_Analysis(void)
sLong Get_Max_Samples(void) const
class CSG_Grids * asGrids(bool bPolymorph=false) const
class CSG_Grid * asGrid(bool bPolymorph=false) const
double Get_Percentile(double Percentile, bool bFromHistogram=true)
virtual bool is_NoData(int x, int y) const
virtual double asDouble(sLong i, bool bScaled=true) const
sLong Get_NCells(void) const
virtual bool is_NoData(int x, int y, int z) const
sLong Get_NCells(void) const
virtual double asDouble(sLong i, bool bScaled=true) const
double Get_Percentile(double Percentile, bool bFromHistogram=true)
CSG_Histogram & operator=(const CSG_Histogram &Histogram)
bool Scale_Element_Count(double Scale)
virtual ~CSG_Histogram(void)
double Get_Center(int i) const
void Add_Value(double Value)
double Get_Value(double i) const
size_t Get_Class_Count(void) const
size_t Get_Cumulative(int i) const
bool Create(const CSG_Histogram &Histogram)
double Get_Quantile(double Quantile) const
double Get_Percentile_Value(double Value) const
double Get_Percentile(double Percentile) const
bool Add_Histogram(const CSG_Histogram &Histogram)
double Get_Break(int i) const
size_t Get_Element_Count(void) const
double Get_Quantile_Value(double Value) const
sLong Get_NRows(void) const
bool from_String(const CSG_String &String)
sLong Get_NCols(void) const
double Get_Determinant(void) const
bool is_Square(void) const
CSG_String to_String(int Width=-1, int Precision=-1, bool bScientific=false, const SG_Char *Separator=NULL) const
CSG_Matrix Get_Inverse(bool bSilent=true, int nSubSquare=0) const
virtual ~CSG_Natural_Breaks(void)
bool Create(class CSG_Table *pTable, int Field, int nClasses, int Histogram=0)
int Get_Count(void) const
static double Get_Gaussian(double mean, double stddev)
static void Initialize(void)
static double Get_Uniform(void)
CSG_Scaler & operator=(const CSG_Scaler &Scaler)
bool Set_Range(double Minimum, double Maximum)
bool Set_Percentile(CSG_Table *pTable, int Field, double Minimum, double Maximum, int Mode=0, double LogScale=1.)
bool Create(const CSG_Scaler &Scaler)
bool _Update(CSG_Table *pTable, int Field, double Minimum, double Maximum, int Mode, double LogScale)
bool Set_StdDev(CSG_Table *pTable, int Field, double StdDev, bool bKeepInRange, int Mode=0, double LogScale=1.)
double Get_Minimum(void) const
double Get_LogScale(void) const
TMode Get_Mode(void) const
bool Set_Linear(CSG_Table *pTable, int Field, double Minimum, double Maximum, int Mode=0, double LogScale=1.)
bool Set_Histogram(CSG_Table *pTable, int Field, int Normalize=-1, double Scale=1.)
double Get_Maximum(void) const
CSG_Histogram m_Histogram
bool Set_LogScale(double LogScale)
sLong Get_IndexOfMinimum(void)
void Add(const CSG_Simple_Statistics &Statistics)
double Get_Percentile(double Percentile)
double Get_Value(sLong i) const
CSG_Simple_Statistics(void)
sLong Get_nValues_Above(double Threshold, bool bEquals=false)
sLong Get_nValues_Below(double Threshold, bool bEquals=false)
int is_Evaluated(void) const
double * Get_Values(void) const
double Get_SkewnessPearson(void)
sLong Get_IndexOfMaximum(void)
bool Set_Count(sLong Count)
void _Evaluate(int Level=1)
bool Create(bool bHoldValues=false)
sLong Get_Count(void) const
void Add_Value(double Value, double Weight=1.)
double Get_Quantile(double Quantile)
int Cmp(const CSG_String &String) const
static CSG_String Format(const char *Format,...)
bool is_Empty(void) const
bool Create(const class wxString *pString)
sLong Get_Index(void) const
double asDouble(int Field) const
int asInt(int Field) const
bool Add_Value(int Field, const double &Value)
const SG_Char * asString(int Field, int Decimals=-99) const
sLong Get_Count(void) const
double Get_Minimum(int Field) const
double Get_Mean(int Field) const
double Get_StdDev(int Field) const
virtual bool Get_Value(sLong Index, int Field, CSG_String &Value) const
bool Set_Index(CSG_Index &Index, int Field, bool bAscending=true) const
const CSG_Histogram & Get_Histogram(int Field, size_t nClasses=0) const
int Get_Field_Count(void) const
double Get_Range(int Field) const
CSG_Table_Record * Get_Record_byIndex(sLong Index) const
double Get_Maximum(int Field) const
static double Get_Norm_P(double Z)
static double Get_F_Inverse(double alpha, int dfn, int dfd, TSG_Test_Distribution_Type Type=TESTDIST_TYPE_Right)
static double Get_F_Tail_from_R2(double R2, int nPredictors, int nSamples, TSG_Test_Distribution_Type Type=TESTDIST_TYPE_Right)
static double Get_T_Tail(double T, int df, TSG_Test_Distribution_Type Type=TESTDIST_TYPE_Right)
static double Get_F_Tail(double F, int dfn, int dfd, TSG_Test_Distribution_Type Type=TESTDIST_TYPE_Right)
static double Get_Norm_Z(double P)
static double Get_T_Inverse(double alpha, int df, TSG_Test_Distribution_Type Type=TESTDIST_TYPE_Right)
void Add_Value(double Value, double Weight=1.)
virtual void Create(bool bWeights=false)
int Get_Class_Index(double Value) const
void Add_Value(const CSG_String &Value, double Weight=1.)
virtual void Create(bool bWeights=false)
int Get_Class_Index(const CSG_String &Value) const
virtual int Get_Minority(bool bWeighted=false) const
int Get_Count(void) const
virtual int Get_Majority(bool bWeighted=false) const
CSG_String to_String(int Width=-1, int Precision=-1, bool bScientific=false, const SG_Char *Separator=NULL) const
sLong Get_Size(void) const
double Get_Angle(const CSG_Vector &Vector) const
bool from_String(const CSG_String &String)
int SG_Compare_Version(const CSG_String &Version, int Major, int Minor, int Release)