Look at amoeba.ijs in math/misc.
Henry Rich
On 4/7/2015 10:53 PM, Joe Bogner wrote:
I have an optimization problem that I figured I'd try solving with J
I have a set of data with a target, multiplier, and weight. I'd like to
calculate 4 multipliers that minimize the error from the current weighted
value = ( target * multiplier * weight);
In other words, I want to essentially fit 4 values to the existing
population
I can calculate 2 quickly and 3 takes about 3-4 minutes. I think 4 may take
hours
This is a brute force method, so I'm interested in alternatives... either
in J or some other software. I'm not familiar enough with this class of
problem to search for other solutions effectively
Thank you for ideas
odometer =: #: i.@(*/)
NB. my range of values are constrained to 0 to 1 in hundredths
nums=:(odometer 100 100 100)
nums=:100%~nums
NB. sample dataset has 10,000 rows to fit
N=:10000
NB. sample data has 4 populations, which have slightly different
distributions
gi=:(?.N#4)
g=:'ABCD' {~ gi
NB. maximum value
l=:(?.N#100)
NB. group a-d range of multipliers
Ar=:(?.N#20)
Br=:(?.N#50)
Cr=:(?.N#70)
Dr=:(?.N#90)
NB. some weights
w=:(?.N#10000)
NB. select multiplier depending on A,B,C,D
NB. there must be a better way to do this
NB. ideally something like
NB. (Ar,.Br,.Cr,.Dr,.gi) {~"1 gi
lm =: 100 %~ ; ({~ 4&{"1) each <"1 (Ar,.Br,.Cr,.Dr,.gi)
NB. weighted value
p=: l*lm*w
NB. total of all weighted values
tp=: +/ p
NB. cost function
cost=: 3 : 0
NB. find the odometer multiplier closest to the current
flm=: lm ((],&0) {~ ([ I.~ ])) y
((tp-(+/ l*flm*w))^2),y
)
costs=. cost"1 nums
NB. best 5
best5=.(5 {. (/: (0{"1 costs))) { costs
NB. re-run best
cost 1}. 0{::best5
The best two values are 0.26 and 0.51
The best three values are 0.18 0.46 and 0.57
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm