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

Reply via email to