00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #if !defined _CLUS_CONTINUOUSLINEARTRANSFORMATION_H
00035 #define _CLUS_CONTINUOUSLINEARTRANSFORMATION_H
00036
00037 #include "vec.h"
00038 #include "cmat.h"
00039 #include <math.h>
00040
00041 using namespace TNT;
00042
00043 namespace CLUS
00044 {
00045
00046
00047
00048
00049
00050
00051 class ContinuousLinearTransformation
00052 {
00053
00054 Vector<bool> mask;
00055
00056
00057 Matrix<double> shifts;
00058
00059
00060 Matrix<double>& dataset;
00061
00062 public:
00063 ContinuousLinearTransformation(int NoAttributes, int NoDatasets, Matrix<double>& TrainingDataset):
00064 mask(NoAttributes), shifts(NoAttributes,NoDatasets), dataset(TrainingDataset)
00065 {
00066 mask=false;
00067 shifts=0;
00068 }
00069
00070 double getShift(int i, int j)
00071 {
00072 assert( mask[i] );
00073 return shifts[i][j];
00074 }
00075
00076 void SetShiftsAttribute(int attrib, Vector<double>& shiftsAtt)
00077 {
00078 assert(shiftsAtt.dim()==shifts.num_cols());
00079
00080 bool isAnyNan=false;
00081
00082 for (int i=0; i<shifts.num_cols(); i++)
00083 {
00084 if (isnan(shiftsAtt[i]))
00085 isAnyNan=true;
00086
00087 shifts[attrib][i]=shiftsAtt[i];
00088 }
00089 mask[attrib]=true;
00090
00091 assert(!isAnyNan);
00092
00093 if (isAnyNan)
00094 return;
00095
00096
00097 for (int i=0; i<dataset.num_rows(); i++)
00098 {
00099 int datasetIndex=(int)dataset[i][(int)dataset.num_cols()-1];
00100
00101
00102 dataset[i][attrib]=dataset[i][attrib]-shiftsAtt[datasetIndex];
00103
00104 }
00105 }
00106
00107 double GetShift(int attrib, int datasetIndex)
00108 {
00109 return shifts[attrib][datasetIndex];
00110 }
00111
00112
00113 void ApplyShiftToTuple(double* dataPoint, int datasetIndex)
00114 {
00115 int noAttribs=mask.dim();
00116 for (int i=0; i<noAttribs; i++)
00117 {
00118 dataPoint[i]=dataPoint[i]-shifts[i][datasetIndex];
00119 }
00120 }
00121
00122 bool HasAttributeShifts(int attrib)
00123 {
00124 return mask[attrib];
00125 }
00126 };
00127
00128 }
00129
00130 #endif // _CLUS_CONTINUOUSLINEARTRANSFORMATION_H