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