comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/estimation/AbstractEstimator.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> <a name="line.17"></a>
21 <FONT color="green">018</FONT> package org.apache.commons.math.estimation;<a name="line.18"></a>
22 <FONT color="green">019</FONT> <a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.util.Arrays;<a name="line.20"></a>
24 <FONT color="green">021</FONT> <a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.linear.InvalidMatrixException;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.linear.LUDecompositionImpl;<a name="line.23"></a>
27 <FONT color="green">024</FONT> import org.apache.commons.math.linear.MatrixUtils;<a name="line.24"></a>
28 <FONT color="green">025</FONT> import org.apache.commons.math.linear.RealMatrix;<a name="line.25"></a>
29 <FONT color="green">026</FONT> <a name="line.26"></a>
30 <FONT color="green">027</FONT> /**<a name="line.27"></a>
31 <FONT color="green">028</FONT> * Base class for implementing estimators.<a name="line.28"></a>
32 <FONT color="green">029</FONT> * &lt;p&gt;This base class handles the boilerplates methods associated to thresholds<a name="line.29"></a>
33 <FONT color="green">030</FONT> * settings, jacobian and error estimation.&lt;/p&gt;<a name="line.30"></a>
34 <FONT color="green">031</FONT> * @version $Revision: 825919 $ $Date: 2009-10-16 10:51:55 -0400 (Fri, 16 Oct 2009) $<a name="line.31"></a>
35 <FONT color="green">032</FONT> * @since 1.2<a name="line.32"></a>
36 <FONT color="green">033</FONT> * @deprecated as of 2.0, everything in package org.apache.commons.math.estimation has<a name="line.33"></a>
37 <FONT color="green">034</FONT> * been deprecated and replaced by package org.apache.commons.math.optimization.general<a name="line.34"></a>
38 <FONT color="green">035</FONT> *<a name="line.35"></a>
39 <FONT color="green">036</FONT> */<a name="line.36"></a>
40 <FONT color="green">037</FONT> @Deprecated<a name="line.37"></a>
41 <FONT color="green">038</FONT> public abstract class AbstractEstimator implements Estimator {<a name="line.38"></a>
42 <FONT color="green">039</FONT> <a name="line.39"></a>
43 <FONT color="green">040</FONT> /** Default maximal number of cost evaluations allowed. */<a name="line.40"></a>
44 <FONT color="green">041</FONT> public static final int DEFAULT_MAX_COST_EVALUATIONS = 100;<a name="line.41"></a>
45 <FONT color="green">042</FONT> <a name="line.42"></a>
46 <FONT color="green">043</FONT> /** Array of measurements. */<a name="line.43"></a>
47 <FONT color="green">044</FONT> protected WeightedMeasurement[] measurements;<a name="line.44"></a>
48 <FONT color="green">045</FONT> <a name="line.45"></a>
49 <FONT color="green">046</FONT> /** Array of parameters. */<a name="line.46"></a>
50 <FONT color="green">047</FONT> protected EstimatedParameter[] parameters;<a name="line.47"></a>
51 <FONT color="green">048</FONT> <a name="line.48"></a>
52 <FONT color="green">049</FONT> /**<a name="line.49"></a>
53 <FONT color="green">050</FONT> * Jacobian matrix.<a name="line.50"></a>
54 <FONT color="green">051</FONT> * &lt;p&gt;This matrix is in canonical form just after the calls to<a name="line.51"></a>
55 <FONT color="green">052</FONT> * {@link #updateJacobian()}, but may be modified by the solver<a name="line.52"></a>
56 <FONT color="green">053</FONT> * in the derived class (the {@link LevenbergMarquardtEstimator<a name="line.53"></a>
57 <FONT color="green">054</FONT> * Levenberg-Marquardt estimator} does this).&lt;/p&gt;<a name="line.54"></a>
58 <FONT color="green">055</FONT> */<a name="line.55"></a>
59 <FONT color="green">056</FONT> protected double[] jacobian;<a name="line.56"></a>
60 <FONT color="green">057</FONT> <a name="line.57"></a>
61 <FONT color="green">058</FONT> /** Number of columns of the jacobian matrix. */<a name="line.58"></a>
62 <FONT color="green">059</FONT> protected int cols;<a name="line.59"></a>
63 <FONT color="green">060</FONT> <a name="line.60"></a>
64 <FONT color="green">061</FONT> /** Number of rows of the jacobian matrix. */<a name="line.61"></a>
65 <FONT color="green">062</FONT> protected int rows;<a name="line.62"></a>
66 <FONT color="green">063</FONT> <a name="line.63"></a>
67 <FONT color="green">064</FONT> /** Residuals array.<a name="line.64"></a>
68 <FONT color="green">065</FONT> * &lt;p&gt;This array is in canonical form just after the calls to<a name="line.65"></a>
69 <FONT color="green">066</FONT> * {@link #updateJacobian()}, but may be modified by the solver<a name="line.66"></a>
70 <FONT color="green">067</FONT> * in the derived class (the {@link LevenbergMarquardtEstimator<a name="line.67"></a>
71 <FONT color="green">068</FONT> * Levenberg-Marquardt estimator} does this).&lt;/p&gt;<a name="line.68"></a>
72 <FONT color="green">069</FONT> */<a name="line.69"></a>
73 <FONT color="green">070</FONT> protected double[] residuals;<a name="line.70"></a>
74 <FONT color="green">071</FONT> <a name="line.71"></a>
75 <FONT color="green">072</FONT> /** Cost value (square root of the sum of the residuals). */<a name="line.72"></a>
76 <FONT color="green">073</FONT> protected double cost;<a name="line.73"></a>
77 <FONT color="green">074</FONT> <a name="line.74"></a>
78 <FONT color="green">075</FONT> /** Maximal allowed number of cost evaluations. */<a name="line.75"></a>
79 <FONT color="green">076</FONT> private int maxCostEval;<a name="line.76"></a>
80 <FONT color="green">077</FONT> <a name="line.77"></a>
81 <FONT color="green">078</FONT> /** Number of cost evaluations. */<a name="line.78"></a>
82 <FONT color="green">079</FONT> private int costEvaluations;<a name="line.79"></a>
83 <FONT color="green">080</FONT> <a name="line.80"></a>
84 <FONT color="green">081</FONT> /** Number of jacobian evaluations. */<a name="line.81"></a>
85 <FONT color="green">082</FONT> private int jacobianEvaluations;<a name="line.82"></a>
86 <FONT color="green">083</FONT> <a name="line.83"></a>
87 <FONT color="green">084</FONT> /**<a name="line.84"></a>
88 <FONT color="green">085</FONT> * Build an abstract estimator for least squares problems.<a name="line.85"></a>
89 <FONT color="green">086</FONT> * &lt;p&gt;The maximal number of cost evaluations allowed is set<a name="line.86"></a>
90 <FONT color="green">087</FONT> * to its default value {@link #DEFAULT_MAX_COST_EVALUATIONS}.&lt;/p&gt;<a name="line.87"></a>
91 <FONT color="green">088</FONT> */<a name="line.88"></a>
92 <FONT color="green">089</FONT> protected AbstractEstimator() {<a name="line.89"></a>
93 <FONT color="green">090</FONT> setMaxCostEval(DEFAULT_MAX_COST_EVALUATIONS);<a name="line.90"></a>
94 <FONT color="green">091</FONT> }<a name="line.91"></a>
95 <FONT color="green">092</FONT> <a name="line.92"></a>
96 <FONT color="green">093</FONT> /**<a name="line.93"></a>
97 <FONT color="green">094</FONT> * Set the maximal number of cost evaluations allowed.<a name="line.94"></a>
98 <FONT color="green">095</FONT> *<a name="line.95"></a>
99 <FONT color="green">096</FONT> * @param maxCostEval maximal number of cost evaluations allowed<a name="line.96"></a>
100 <FONT color="green">097</FONT> * @see #estimate<a name="line.97"></a>
101 <FONT color="green">098</FONT> */<a name="line.98"></a>
102 <FONT color="green">099</FONT> public final void setMaxCostEval(int maxCostEval) {<a name="line.99"></a>
103 <FONT color="green">100</FONT> this.maxCostEval = maxCostEval;<a name="line.100"></a>
104 <FONT color="green">101</FONT> }<a name="line.101"></a>
105 <FONT color="green">102</FONT> <a name="line.102"></a>
106 <FONT color="green">103</FONT> /**<a name="line.103"></a>
107 <FONT color="green">104</FONT> * Get the number of cost evaluations.<a name="line.104"></a>
108 <FONT color="green">105</FONT> *<a name="line.105"></a>
109 <FONT color="green">106</FONT> * @return number of cost evaluations<a name="line.106"></a>
110 <FONT color="green">107</FONT> * */<a name="line.107"></a>
111 <FONT color="green">108</FONT> public final int getCostEvaluations() {<a name="line.108"></a>
112 <FONT color="green">109</FONT> return costEvaluations;<a name="line.109"></a>
113 <FONT color="green">110</FONT> }<a name="line.110"></a>
114 <FONT color="green">111</FONT> <a name="line.111"></a>
115 <FONT color="green">112</FONT> /**<a name="line.112"></a>
116 <FONT color="green">113</FONT> * Get the number of jacobian evaluations.<a name="line.113"></a>
117 <FONT color="green">114</FONT> *<a name="line.114"></a>
118 <FONT color="green">115</FONT> * @return number of jacobian evaluations<a name="line.115"></a>
119 <FONT color="green">116</FONT> * */<a name="line.116"></a>
120 <FONT color="green">117</FONT> public final int getJacobianEvaluations() {<a name="line.117"></a>
121 <FONT color="green">118</FONT> return jacobianEvaluations;<a name="line.118"></a>
122 <FONT color="green">119</FONT> }<a name="line.119"></a>
123 <FONT color="green">120</FONT> <a name="line.120"></a>
124 <FONT color="green">121</FONT> /**<a name="line.121"></a>
125 <FONT color="green">122</FONT> * Update the jacobian matrix.<a name="line.122"></a>
126 <FONT color="green">123</FONT> */<a name="line.123"></a>
127 <FONT color="green">124</FONT> protected void updateJacobian() {<a name="line.124"></a>
128 <FONT color="green">125</FONT> incrementJacobianEvaluationsCounter();<a name="line.125"></a>
129 <FONT color="green">126</FONT> Arrays.fill(jacobian, 0);<a name="line.126"></a>
130 <FONT color="green">127</FONT> int index = 0;<a name="line.127"></a>
131 <FONT color="green">128</FONT> for (int i = 0; i &lt; rows; i++) {<a name="line.128"></a>
132 <FONT color="green">129</FONT> WeightedMeasurement wm = measurements[i];<a name="line.129"></a>
133 <FONT color="green">130</FONT> double factor = -Math.sqrt(wm.getWeight());<a name="line.130"></a>
134 <FONT color="green">131</FONT> for (int j = 0; j &lt; cols; ++j) {<a name="line.131"></a>
135 <FONT color="green">132</FONT> jacobian[index++] = factor * wm.getPartial(parameters[j]);<a name="line.132"></a>
136 <FONT color="green">133</FONT> }<a name="line.133"></a>
137 <FONT color="green">134</FONT> }<a name="line.134"></a>
138 <FONT color="green">135</FONT> }<a name="line.135"></a>
139 <FONT color="green">136</FONT> <a name="line.136"></a>
140 <FONT color="green">137</FONT> /**<a name="line.137"></a>
141 <FONT color="green">138</FONT> * Increment the jacobian evaluations counter.<a name="line.138"></a>
142 <FONT color="green">139</FONT> */<a name="line.139"></a>
143 <FONT color="green">140</FONT> protected final void incrementJacobianEvaluationsCounter() {<a name="line.140"></a>
144 <FONT color="green">141</FONT> ++jacobianEvaluations;<a name="line.141"></a>
145 <FONT color="green">142</FONT> }<a name="line.142"></a>
146 <FONT color="green">143</FONT> <a name="line.143"></a>
147 <FONT color="green">144</FONT> /**<a name="line.144"></a>
148 <FONT color="green">145</FONT> * Update the residuals array and cost function value.<a name="line.145"></a>
149 <FONT color="green">146</FONT> * @exception EstimationException if the number of cost evaluations<a name="line.146"></a>
150 <FONT color="green">147</FONT> * exceeds the maximum allowed<a name="line.147"></a>
151 <FONT color="green">148</FONT> */<a name="line.148"></a>
152 <FONT color="green">149</FONT> protected void updateResidualsAndCost()<a name="line.149"></a>
153 <FONT color="green">150</FONT> throws EstimationException {<a name="line.150"></a>
154 <FONT color="green">151</FONT> <a name="line.151"></a>
155 <FONT color="green">152</FONT> if (++costEvaluations &gt; maxCostEval) {<a name="line.152"></a>
156 <FONT color="green">153</FONT> throw new EstimationException("maximal number of evaluations exceeded ({0})",<a name="line.153"></a>
157 <FONT color="green">154</FONT> maxCostEval);<a name="line.154"></a>
158 <FONT color="green">155</FONT> }<a name="line.155"></a>
159 <FONT color="green">156</FONT> <a name="line.156"></a>
160 <FONT color="green">157</FONT> cost = 0;<a name="line.157"></a>
161 <FONT color="green">158</FONT> int index = 0;<a name="line.158"></a>
162 <FONT color="green">159</FONT> for (int i = 0; i &lt; rows; i++, index += cols) {<a name="line.159"></a>
163 <FONT color="green">160</FONT> WeightedMeasurement wm = measurements[i];<a name="line.160"></a>
164 <FONT color="green">161</FONT> double residual = wm.getResidual();<a name="line.161"></a>
165 <FONT color="green">162</FONT> residuals[i] = Math.sqrt(wm.getWeight()) * residual;<a name="line.162"></a>
166 <FONT color="green">163</FONT> cost += wm.getWeight() * residual * residual;<a name="line.163"></a>
167 <FONT color="green">164</FONT> }<a name="line.164"></a>
168 <FONT color="green">165</FONT> cost = Math.sqrt(cost);<a name="line.165"></a>
169 <FONT color="green">166</FONT> <a name="line.166"></a>
170 <FONT color="green">167</FONT> }<a name="line.167"></a>
171 <FONT color="green">168</FONT> <a name="line.168"></a>
172 <FONT color="green">169</FONT> /**<a name="line.169"></a>
173 <FONT color="green">170</FONT> * Get the Root Mean Square value.<a name="line.170"></a>
174 <FONT color="green">171</FONT> * Get the Root Mean Square value, i.e. the root of the arithmetic<a name="line.171"></a>
175 <FONT color="green">172</FONT> * mean of the square of all weighted residuals. This is related to the<a name="line.172"></a>
176 <FONT color="green">173</FONT> * criterion that is minimized by the estimator as follows: if<a name="line.173"></a>
177 <FONT color="green">174</FONT> * &lt;em&gt;c&lt;/em&gt; if the criterion, and &lt;em&gt;n&lt;/em&gt; is the number of<a name="line.174"></a>
178 <FONT color="green">175</FONT> * measurements, then the RMS is &lt;em&gt;sqrt (c/n)&lt;/em&gt;.<a name="line.175"></a>
179 <FONT color="green">176</FONT> *<a name="line.176"></a>
180 <FONT color="green">177</FONT> * @param problem estimation problem<a name="line.177"></a>
181 <FONT color="green">178</FONT> * @return RMS value<a name="line.178"></a>
182 <FONT color="green">179</FONT> */<a name="line.179"></a>
183 <FONT color="green">180</FONT> public double getRMS(EstimationProblem problem) {<a name="line.180"></a>
184 <FONT color="green">181</FONT> WeightedMeasurement[] wm = problem.getMeasurements();<a name="line.181"></a>
185 <FONT color="green">182</FONT> double criterion = 0;<a name="line.182"></a>
186 <FONT color="green">183</FONT> for (int i = 0; i &lt; wm.length; ++i) {<a name="line.183"></a>
187 <FONT color="green">184</FONT> double residual = wm[i].getResidual();<a name="line.184"></a>
188 <FONT color="green">185</FONT> criterion += wm[i].getWeight() * residual * residual;<a name="line.185"></a>
189 <FONT color="green">186</FONT> }<a name="line.186"></a>
190 <FONT color="green">187</FONT> return Math.sqrt(criterion / wm.length);<a name="line.187"></a>
191 <FONT color="green">188</FONT> }<a name="line.188"></a>
192 <FONT color="green">189</FONT> <a name="line.189"></a>
193 <FONT color="green">190</FONT> /**<a name="line.190"></a>
194 <FONT color="green">191</FONT> * Get the Chi-Square value.<a name="line.191"></a>
195 <FONT color="green">192</FONT> * @param problem estimation problem<a name="line.192"></a>
196 <FONT color="green">193</FONT> * @return chi-square value<a name="line.193"></a>
197 <FONT color="green">194</FONT> */<a name="line.194"></a>
198 <FONT color="green">195</FONT> public double getChiSquare(EstimationProblem problem) {<a name="line.195"></a>
199 <FONT color="green">196</FONT> WeightedMeasurement[] wm = problem.getMeasurements();<a name="line.196"></a>
200 <FONT color="green">197</FONT> double chiSquare = 0;<a name="line.197"></a>
201 <FONT color="green">198</FONT> for (int i = 0; i &lt; wm.length; ++i) {<a name="line.198"></a>
202 <FONT color="green">199</FONT> double residual = wm[i].getResidual();<a name="line.199"></a>
203 <FONT color="green">200</FONT> chiSquare += residual * residual / wm[i].getWeight();<a name="line.200"></a>
204 <FONT color="green">201</FONT> }<a name="line.201"></a>
205 <FONT color="green">202</FONT> return chiSquare;<a name="line.202"></a>
206 <FONT color="green">203</FONT> }<a name="line.203"></a>
207 <FONT color="green">204</FONT> <a name="line.204"></a>
208 <FONT color="green">205</FONT> /**<a name="line.205"></a>
209 <FONT color="green">206</FONT> * Get the covariance matrix of unbound estimated parameters.<a name="line.206"></a>
210 <FONT color="green">207</FONT> * @param problem estimation problem<a name="line.207"></a>
211 <FONT color="green">208</FONT> * @return covariance matrix<a name="line.208"></a>
212 <FONT color="green">209</FONT> * @exception EstimationException if the covariance matrix<a name="line.209"></a>
213 <FONT color="green">210</FONT> * cannot be computed (singular problem)<a name="line.210"></a>
214 <FONT color="green">211</FONT> */<a name="line.211"></a>
215 <FONT color="green">212</FONT> public double[][] getCovariances(EstimationProblem problem)<a name="line.212"></a>
216 <FONT color="green">213</FONT> throws EstimationException {<a name="line.213"></a>
217 <FONT color="green">214</FONT> <a name="line.214"></a>
218 <FONT color="green">215</FONT> // set up the jacobian<a name="line.215"></a>
219 <FONT color="green">216</FONT> updateJacobian();<a name="line.216"></a>
220 <FONT color="green">217</FONT> <a name="line.217"></a>
221 <FONT color="green">218</FONT> // compute transpose(J).J, avoiding building big intermediate matrices<a name="line.218"></a>
222 <FONT color="green">219</FONT> final int n = problem.getMeasurements().length;<a name="line.219"></a>
223 <FONT color="green">220</FONT> final int m = problem.getUnboundParameters().length;<a name="line.220"></a>
224 <FONT color="green">221</FONT> final int max = m * n;<a name="line.221"></a>
225 <FONT color="green">222</FONT> double[][] jTj = new double[m][m];<a name="line.222"></a>
226 <FONT color="green">223</FONT> for (int i = 0; i &lt; m; ++i) {<a name="line.223"></a>
227 <FONT color="green">224</FONT> for (int j = i; j &lt; m; ++j) {<a name="line.224"></a>
228 <FONT color="green">225</FONT> double sum = 0;<a name="line.225"></a>
229 <FONT color="green">226</FONT> for (int k = 0; k &lt; max; k += m) {<a name="line.226"></a>
230 <FONT color="green">227</FONT> sum += jacobian[k + i] * jacobian[k + j];<a name="line.227"></a>
231 <FONT color="green">228</FONT> }<a name="line.228"></a>
232 <FONT color="green">229</FONT> jTj[i][j] = sum;<a name="line.229"></a>
233 <FONT color="green">230</FONT> jTj[j][i] = sum;<a name="line.230"></a>
234 <FONT color="green">231</FONT> }<a name="line.231"></a>
235 <FONT color="green">232</FONT> }<a name="line.232"></a>
236 <FONT color="green">233</FONT> <a name="line.233"></a>
237 <FONT color="green">234</FONT> try {<a name="line.234"></a>
238 <FONT color="green">235</FONT> // compute the covariances matrix<a name="line.235"></a>
239 <FONT color="green">236</FONT> RealMatrix inverse =<a name="line.236"></a>
240 <FONT color="green">237</FONT> new LUDecompositionImpl(MatrixUtils.createRealMatrix(jTj)).getSolver().getInverse();<a name="line.237"></a>
241 <FONT color="green">238</FONT> return inverse.getData();<a name="line.238"></a>
242 <FONT color="green">239</FONT> } catch (InvalidMatrixException ime) {<a name="line.239"></a>
243 <FONT color="green">240</FONT> throw new EstimationException("unable to compute covariances: singular problem");<a name="line.240"></a>
244 <FONT color="green">241</FONT> }<a name="line.241"></a>
245 <FONT color="green">242</FONT> <a name="line.242"></a>
246 <FONT color="green">243</FONT> }<a name="line.243"></a>
247 <FONT color="green">244</FONT> <a name="line.244"></a>
248 <FONT color="green">245</FONT> /**<a name="line.245"></a>
249 <FONT color="green">246</FONT> * Guess the errors in unbound estimated parameters.<a name="line.246"></a>
250 <FONT color="green">247</FONT> * &lt;p&gt;Guessing is covariance-based, it only gives rough order of magnitude.&lt;/p&gt;<a name="line.247"></a>
251 <FONT color="green">248</FONT> * @param problem estimation problem<a name="line.248"></a>
252 <FONT color="green">249</FONT> * @return errors in estimated parameters<a name="line.249"></a>
253 <FONT color="green">250</FONT> * @exception EstimationException if the covariances matrix cannot be computed<a name="line.250"></a>
254 <FONT color="green">251</FONT> * or the number of degrees of freedom is not positive (number of measurements<a name="line.251"></a>
255 <FONT color="green">252</FONT> * lesser or equal to number of parameters)<a name="line.252"></a>
256 <FONT color="green">253</FONT> */<a name="line.253"></a>
257 <FONT color="green">254</FONT> public double[] guessParametersErrors(EstimationProblem problem)<a name="line.254"></a>
258 <FONT color="green">255</FONT> throws EstimationException {<a name="line.255"></a>
259 <FONT color="green">256</FONT> int m = problem.getMeasurements().length;<a name="line.256"></a>
260 <FONT color="green">257</FONT> int p = problem.getUnboundParameters().length;<a name="line.257"></a>
261 <FONT color="green">258</FONT> if (m &lt;= p) {<a name="line.258"></a>
262 <FONT color="green">259</FONT> throw new EstimationException(<a name="line.259"></a>
263 <FONT color="green">260</FONT> "no degrees of freedom ({0} measurements, {1} parameters)",<a name="line.260"></a>
264 <FONT color="green">261</FONT> m, p);<a name="line.261"></a>
265 <FONT color="green">262</FONT> }<a name="line.262"></a>
266 <FONT color="green">263</FONT> double[] errors = new double[problem.getUnboundParameters().length];<a name="line.263"></a>
267 <FONT color="green">264</FONT> final double c = Math.sqrt(getChiSquare(problem) / (m - p));<a name="line.264"></a>
268 <FONT color="green">265</FONT> double[][] covar = getCovariances(problem);<a name="line.265"></a>
269 <FONT color="green">266</FONT> for (int i = 0; i &lt; errors.length; ++i) {<a name="line.266"></a>
270 <FONT color="green">267</FONT> errors[i] = Math.sqrt(covar[i][i]) * c;<a name="line.267"></a>
271 <FONT color="green">268</FONT> }<a name="line.268"></a>
272 <FONT color="green">269</FONT> return errors;<a name="line.269"></a>
273 <FONT color="green">270</FONT> }<a name="line.270"></a>
274 <FONT color="green">271</FONT> <a name="line.271"></a>
275 <FONT color="green">272</FONT> /**<a name="line.272"></a>
276 <FONT color="green">273</FONT> * Initialization of the common parts of the estimation.<a name="line.273"></a>
277 <FONT color="green">274</FONT> * &lt;p&gt;This method &lt;em&gt;must&lt;/em&gt; be called at the start<a name="line.274"></a>
278 <FONT color="green">275</FONT> * of the {@link #estimate(EstimationProblem) estimate}<a name="line.275"></a>
279 <FONT color="green">276</FONT> * method.&lt;/p&gt;<a name="line.276"></a>
280 <FONT color="green">277</FONT> * @param problem estimation problem to solve<a name="line.277"></a>
281 <FONT color="green">278</FONT> */<a name="line.278"></a>
282 <FONT color="green">279</FONT> protected void initializeEstimate(EstimationProblem problem) {<a name="line.279"></a>
283 <FONT color="green">280</FONT> <a name="line.280"></a>
284 <FONT color="green">281</FONT> // reset counters<a name="line.281"></a>
285 <FONT color="green">282</FONT> costEvaluations = 0;<a name="line.282"></a>
286 <FONT color="green">283</FONT> jacobianEvaluations = 0;<a name="line.283"></a>
287 <FONT color="green">284</FONT> <a name="line.284"></a>
288 <FONT color="green">285</FONT> // retrieve the equations and the parameters<a name="line.285"></a>
289 <FONT color="green">286</FONT> measurements = problem.getMeasurements();<a name="line.286"></a>
290 <FONT color="green">287</FONT> parameters = problem.getUnboundParameters();<a name="line.287"></a>
291 <FONT color="green">288</FONT> <a name="line.288"></a>
292 <FONT color="green">289</FONT> // arrays shared with the other private methods<a name="line.289"></a>
293 <FONT color="green">290</FONT> rows = measurements.length;<a name="line.290"></a>
294 <FONT color="green">291</FONT> cols = parameters.length;<a name="line.291"></a>
295 <FONT color="green">292</FONT> jacobian = new double[rows * cols];<a name="line.292"></a>
296 <FONT color="green">293</FONT> residuals = new double[rows];<a name="line.293"></a>
297 <FONT color="green">294</FONT> <a name="line.294"></a>
298 <FONT color="green">295</FONT> cost = Double.POSITIVE_INFINITY;<a name="line.295"></a>
299 <FONT color="green">296</FONT> <a name="line.296"></a>
300 <FONT color="green">297</FONT> }<a name="line.297"></a>
301 <FONT color="green">298</FONT> <a name="line.298"></a>
302 <FONT color="green">299</FONT> /**<a name="line.299"></a>
303 <FONT color="green">300</FONT> * Solve an estimation problem.<a name="line.300"></a>
304 <FONT color="green">301</FONT> *<a name="line.301"></a>
305 <FONT color="green">302</FONT> * &lt;p&gt;The method should set the parameters of the problem to several<a name="line.302"></a>
306 <FONT color="green">303</FONT> * trial values until it reaches convergence. If this method returns<a name="line.303"></a>
307 <FONT color="green">304</FONT> * normally (i.e. without throwing an exception), then the best<a name="line.304"></a>
308 <FONT color="green">305</FONT> * estimate of the parameters can be retrieved from the problem<a name="line.305"></a>
309 <FONT color="green">306</FONT> * itself, through the {@link EstimationProblem#getAllParameters<a name="line.306"></a>
310 <FONT color="green">307</FONT> * EstimationProblem.getAllParameters} method.&lt;/p&gt;<a name="line.307"></a>
311 <FONT color="green">308</FONT> *<a name="line.308"></a>
312 <FONT color="green">309</FONT> * @param problem estimation problem to solve<a name="line.309"></a>
313 <FONT color="green">310</FONT> * @exception EstimationException if the problem cannot be solved<a name="line.310"></a>
314 <FONT color="green">311</FONT> *<a name="line.311"></a>
315 <FONT color="green">312</FONT> */<a name="line.312"></a>
316 <FONT color="green">313</FONT> public abstract void estimate(EstimationProblem problem)<a name="line.313"></a>
317 <FONT color="green">314</FONT> throws EstimationException;<a name="line.314"></a>
318 <FONT color="green">315</FONT> <a name="line.315"></a>
319 <FONT color="green">316</FONT> }<a name="line.316"></a>
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380 </PRE>
381 </BODY>
382 </HTML>