-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathT4StandardNormalizer.m
140 lines (118 loc) · 3.63 KB
/
T4StandardNormalizer.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#import "T4StandardNormalizer.h"
@implementation T4StandardNormalizer
-initWithMeans: (T4Matrix*)someMeans standardDeviations: (T4Matrix*)someStandardDeviations
{
if( (self = [super init]) )
{
if([someMeans numberOfRows] != [someStandardDeviations numberOfRows])
T4Error(@"StandardNormalizer: mean and standard deviation matrices do not match!!!");
means = [someMeans retainAndKeepWithAllocator: allocator];
standardDeviations = [someStandardDeviations retainAndKeepWithAllocator: allocator];
}
return self;
}
-initWithDataset: (NSArray*)aDataset columnIndex: (int)anIndex
{
int numRows;
int numExamples;
int totalNumColumns;
T4Matrix *someMeans;
T4Matrix *someStandardDeviations;
real *meanColumn;
real *standardDeviationColumn;
int r, c, e;
numExamples = [aDataset count];
numRows = [[[aDataset objectAtIndex: 0] objectAtIndex: anIndex] numberOfRows];
someMeans = [[[T4Matrix alloc] initWithNumberOfRows: numRows] keepWithAllocator: allocator];
someStandardDeviations = [[[T4Matrix alloc] initWithNumberOfRows: numRows] keepWithAllocator: allocator];
meanColumn = [someMeans firstColumn];
standardDeviationColumn = [someStandardDeviations firstColumn];
[someMeans zero];
[someStandardDeviations zero];
totalNumColumns = 0;
for(e = 0; e < numExamples; e++)
{
T4Matrix *matrix = [[aDataset objectAtIndex: e] objectAtIndex: anIndex];
int numColumns = [matrix numberOfColumns];
for(c = 0; c < numColumns; c++)
{
real *matrixColumn = [matrix columnAtIndex: c];
for(r = 0; r < numRows; r++)
{
real z = matrixColumn[r];
meanColumn[r] += z;
standardDeviationColumn[r] += z*z;
}
}
totalNumColumns += numColumns;
}
for(r = 0; r < numRows; r++)
{
meanColumn[r] /= (real)totalNumColumns;
standardDeviationColumn[r] /= (real)totalNumColumns;
standardDeviationColumn[r] -= meanColumn[r]*meanColumn[r];
standardDeviationColumn[r] = sqrt(standardDeviationColumn[r]);
}
return [self initWithMeans: someMeans standardDeviations: someStandardDeviations];
}
-initWithDataset: (NSArray*)aDataset
{
return [self initWithDataset: aDataset columnIndex: 0];
}
-normalizeDataset: (NSArray*)aDataset columnIndex: (int)anIndex
{
int numExamples = [aDataset count];
int e;
for(e = 0; e < numExamples; e++)
{
T4Matrix *matrix = [[aDataset objectAtIndex: e] objectAtIndex: anIndex];
[self normalizeMatrix: matrix];
}
return self;
}
-normalizeDataset: (NSArray*)aDataset
{
return [self normalizeDataset: aDataset columnIndex: 0];
}
-normalizeMatrix: (T4Matrix*)aMatrix
{
int numColumns = [aMatrix numberOfColumns];
int numRows = [aMatrix numberOfRows];
real *meanColumn = [means firstColumn];
real *standardDeviationColumn = [standardDeviations firstColumn];
int r, c;
for(c = 0; c < numColumns; c++)
{
real *matrixColumn = [aMatrix columnAtIndex: c];
for(r = 0; r < numRows; r++)
{
if(standardDeviationColumn[r] > 0)
matrixColumn[r] = (matrixColumn[r] - meanColumn[r]) / standardDeviationColumn[r];
else
matrixColumn[r] -= meanColumn[r];
}
}
return self;
}
-(T4Matrix*)means
{
return means;
}
-(T4Matrix*)standardDeviations
{
return standardDeviations;
}
-initWithCoder: (NSCoder*)aCoder
{
self = [super initWithCoder: aCoder];
means = [[aCoder decodeObject] retainAndKeepWithAllocator: allocator];
standardDeviations = [[aCoder decodeObject] retainAndKeepWithAllocator: allocator];
return self;
}
-(void)encodeWithCoder: (NSCoder*)aCoder
{
[super encodeWithCoder: aCoder];
[aCoder encodeObject: means];
[aCoder encodeObject: standardDeviations];
}
@end