Re: weighted averages from 2 matrices
- To: mathgroup at smc.vnet.net
- Subject: [mg96138] Re: [mg96108] weighted averages from 2 matrices
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Fri, 6 Feb 2009 04:13:18 -0500 (EST)
- References: <200902050939.EAA10464@smc.vnet.net>
- Reply-to: drmajorbob at longhorns.com
OK, I'd suggest you remove about 14 typos and repost workable code.
Edit>Copy as Plain Text, then paste into e-mail.
Here's my guess at the first part of it, but I'm not willing to waste more
time:
values = Array[V, {5, 4}];
samples = Array[S, {6, 4}];
Row[" values =" , MatrixForm[values], " ", "samples =",
MatrixForm[samples]]
Row[" values =", {{V[1, 1], V[1, 2], V[1, 3], V[1, 4]}, {V[2, 1],
V[2, 2], V[2, 3], V[2, 4]}, {V[3, 1], V[3, 2], V[3, 3],
V[3, 4]}, {V[4, 1], V[4, 2], V[4, 3], V[4, 4]}, {V[5, 1], V[5, 2],
V[5, 3], V[5, 4]}}, " ", "samples =", {{S[1, 1], S[1, 2],
S[1, 3], S[1, 4]}, {S[2, 1], S[2, 2], S[2, 3], S[2, 4]}, {S[3, 1],
S[3, 2], S[3, 3], S[3, 4]}, {S[4, 1], S[4, 2], S[4, 3],
S[4, 4]}, {S[5, 1], S[5, 2], S[5, 3], S[5, 4]}, {S[6, 1], S[6, 2],
S[6, 3], S[6, 4]}}]
Bobby
On Thu, 05 Feb 2009 03:39:33 -0600, Andreas <aagas at ix.netcom.com> wrote:
> This builds on an earlier post, but involves a different enough problem,
> that I thought it merited a separate thread.
>
> I need to calculate a list or vector of weighted averages of
> n-dimensional samples, where the matrix "values" provides corresponding
> weights to the set of samples in matrix "samples" i.e.: I have two
> matrices:
>
> values = Array[V, ## &, {5, 4};
> samples = Array[S, ## &, {6, 4};
> Row[{" values =" MatrixForm[values, " ", "samples ="
> MatrixForm[samples}
>
> (* The code yields something like this *)
>
> V1,1 V1,2 V1,3 V1,4
> V2,1 V2,2 V2,3 V2,4
> V3,1 V3,2 V3,3 V3,4
> V4,1 V4,2 V4,3 V4,4
> V5,1 V5,2 V5,3 V5,4
>
> S1,1 S1,2 S1,3 S1,4
> S2,1 S2,2 S2,3 S2,4
> S3,1 S3,2 S3,3 S3,4
> S4,1 S4,2 S4,3 S4,4
> S5,1 S5,2 S5,3 S5,4
> S6,1 S6,2 S6,3 S6,4
>
> Columns in each matrix can run from 1 to n in number. Both matrices
> will always have the same number of columns. The number of rows in each
> matrix can differ one from the other, sometimes "values" might have more
> rows, sometimes "samples" will. In use samples will likely have around
> 1,000 to 10,000 rows and "values" may have more or less.
>
> Similar to what I asked about in an earlier post, I want to do the
> following:
>
> Multiply each element in a row of the matrix "values" by the
> corresponding column value in each of the rows of "samples", multiply
> the products of each new row, raise them to a power 1/(number of
> columns) and add one. Then calculate the Mean of that set relative to
> each row in values.
>
> So, for the first weighted average (using the first row of "values") I
> need to get something like this:
>
> Mean[{{1 + ((V1,1 * S1,1)*(V1,2 * S1,2)*(V1,3 * S1,3)*(V1,4 *
> S1,4))^(1/Length[values[[1)},
> {1 + ((V1,1 * S2,1)*(V1,2 * S2,2)*(V1,3 * S2,3)*(V1,4 *
> S2,4))^(1/Length[values[[1)},
> {1 + ((V1,1 * S3,1)*(V1,2 * S3,2)*(V1,3 * S3,3)*(V1,4 *
> S3,4))^(1/Length[values[[1)},
> {1 + ((V1,1 * S4,1)*(V1,2 * S4,2)*(V1,3 * S4,3)*(V1,4 *
> S4,4))^(1/Length[values[[1)},
> {1 + ((V1,1 * S5,1)*(V1,2 * S5,2)*(V1,3 * S5,3)*(V1,4 *
> S5,4))^(1/Length[values[[1)},
> {1 + ((V1,1 * S6,1)*(V1,2 * S6,2)*(V1,3 * S6,3)*(V1,4 *
> S6,4))^(1/Length[values[[1)}}]
>
>
> Then I need to Map that calculation in the same way across each
> successive row in the "values" matrix to generate my vector of weighted
> averages. I can do all of this iteratively, but I want to try thinking
> more like a mathematician or functional programmer.
>
> The following gives me the above, but only for the designated rows in
> each of the matrices:
>
>
> 1 + Inner[Times, values[[1]], samples[[1]],
> Times]^(1/Length[values[[1]]])
>
> 1 + (S1,1 * S1,2 * S1,3 * S1,4 * V1,1 * V1,2 * V1,3 * V1,4)^(1/4)
>
>
> Minor note, ideally I'd use a count of values > 0 rather than
> Length[[1]] in the above, but getting a 0 value in either matrix would
> happen very rarely.
>
> With some data:
>
> aSample = {{0.503171, 0.0178498, 0.351913, 0.127065}};
> aValue = {{1.03, 1.01, .987, 1.1}};
> 1 + Inner[Times, aValue[[1]], aSample[[1]],
> Times]^(1/Length[aValue[[1]]])
>
> 1.14594
>
>
> Building on that, I hoped I could use something with Map, Mean, and
> Inner. Something generally like:
>
> Map[Mean[Inner[Times, values, samples, Times]^(1 / Length[values[[1]]])
> + 1], values]
>
> or adapt an earlier solution to a slightly different problem from
> Jean-Mark Gulliet on the order of:
>
>
> Clear[f1, f2, f3]
> f1 = Function[{values, samples}, 1 + Inner[Times, values, samples,
> Times]^(1/Length[values[[1]]])];
> f2 = Function[{values, samples}, Mean[(f1[#1, values] &) /@ samples]];
> f3[values_, samples_] := Map[(f2[samples, #1] &), values]
>
>
> f3[values, samples]
>
> But this doesn't work at all :-(
>
> I still need to make the shift from procedural to functional programing
> so I can't quite see the solution.
> I hope I've at least done a clear job of stating the problem.
>
> Any help much appreciated.
>
--
DrMajorBob at longhorns.com
- References:
- weighted averages from 2 matrices
- From: Andreas <aagas@ix.netcom.com>
- weighted averages from 2 matrices