comparison src/EM.cpp @ 53:9e2d1f6cd43a

Fix incorrect normalisation of source activation matrix
author Chris Cannam
date Mon, 07 Apr 2014 17:34:19 +0100
parents 9b17bbd16a5f
children a54df67e607e
comparison
equal deleted inserted replaced
51:782ca0d9ff3e 53:9e2d1f6cd43a
45 for (int n = 0; n < m_notes; ++n) { 45 for (int n = 0; n < m_notes; ++n) {
46 m_pitches[n] = drand48(); 46 m_pitches[n] = drand48();
47 } 47 }
48 48
49 m_sources = Grid(m_instruments); 49 m_sources = Grid(m_instruments);
50
51 for (int i = 0; i < m_instruments; ++i) { 50 for (int i = 0; i < m_instruments; ++i) {
52 m_sources[i] = V(m_notes); 51 m_sources[i] = V(m_notes);
53 for (int n = 0; n < m_notes; ++n) { 52 for (int n = 0; n < m_notes; ++n) {
54 m_sources[i][n] = (inRange(i, n) ? 1.0 : 0.0); 53 m_sources[i][n] = (inRange(i, n) ? 1.0 : 0.0);
55 } 54 }
77 for (int i = 0; i < (int)column.size(); ++i) { 76 for (int i = 0; i < (int)column.size(); ++i) {
78 sum += column[i]; 77 sum += column[i];
79 } 78 }
80 for (int i = 0; i < (int)column.size(); ++i) { 79 for (int i = 0; i < (int)column.size(); ++i) {
81 column[i] /= sum; 80 column[i] /= sum;
81 }
82 }
83
84 void
85 EM::normaliseSources(Grid &sources)
86 {
87 V denominators(sources[0].size());
88
89 for (int i = 0; i < (int)sources.size(); ++i) {
90 for (int j = 0; j < (int)sources[i].size(); ++j) {
91 denominators[j] += sources[i][j];
92 }
93 }
94
95 for (int i = 0; i < (int)sources.size(); ++i) {
96 for (int j = 0; j < (int)sources[i].size(); ++j) {
97 sources[i][j] /= denominators[j];
98 }
82 } 99 }
83 } 100 }
84 101
85 void 102 void
86 EM::iterate(V column) 103 EM::iterate(V column)
153 } 170 }
154 if (m_sourceSparsity != 1.0) { 171 if (m_sourceSparsity != 1.0) {
155 newSources[i][n] = pow(newSources[i][n], m_sourceSparsity); 172 newSources[i][n] = pow(newSources[i][n], m_sourceSparsity);
156 } 173 }
157 } 174 }
158 normalise(newSources[i]); 175 }
159 } 176 normaliseSources(newSources);
160 177
161 m_pitches = newPitches; 178 m_pitches = newPitches;
162 m_sources = newSources; 179 m_sources = newSources;
163 } 180 }
164 181