Very cool. I think figured out #1 It seems to work if I supply the boundaries of the variables to amoeba. The first parameter item in the list is my guess, the next items are the bounds of the slope and intercept
f=: 3 : 0 'a b' =. y +/ | (Y-(a+b*X)) ) f amoeba 1e_12 ((0,0),(0,5),:1 12) +---------------+-------+ |10.6111 2.73778|11.6222| +---------------+-------+ Plot of the raw vs amoeba and %. solutions http://i.imgur.com/8v9BuWs.png I think I am starting to get a sense for #2 as well redefining my cost function to sort y so it's stable with I. and to divide by 100 costa=: 3 : 0 flm=: lm ((],&0) {~ ([ I.~ ])) ((/:~y)%100) +/ | (p-(l*flm*w)) ) costa amoeba 1e_12 ((1,100),(1,100),.(1,100)) +-----+---------+ |20 49|5.19783e8| +-----+---------+ Which gives virtually the same answer, much quicker, as the brute force 5.17022e8 0.19 0.49 How can I now solve for 3 variables? The brute force/odometer solution is 3.28832e8 0.19 0.49 0.89 costa amoeba 1e_12 ((100,100,100),(100,100,100),.(100,100,100)) +---------+--------+ |100 100 0|1.7143e9| +---------+--------+ On Wed, Apr 8, 2015 at 9:53 AM, Joe Bogner <[email protected]> wrote: > Hi Henry, > > Thanks for the tip. I looked into it and can see how its concepts overlap > my problem. I'm not sure how to generalize my problem into the simplex form > so that method can be used. > > I found an example of using amoeba that made some sense to me: > https://www.astro.virginia.edu/class/oconnell/astr511/idl_5.1_html/idl6.htm > -- solving a simple x/y system of equations (like linear regression). I'm > also unable to figure out how to translate that problem to your amoeba > implementation > > X=:(i.17)*5 > Y =: 12.0, 24.3, 39.6, 51.0, 66.5, 78.4, 92.7, 107.8, 120.0, 135.5, 147.5, > 161.0, 175.4, 187.4, 202.5, 215.4, 229.9 > > NB. linear regression is close to the referenced page output > NB. IDL prints: > NB. Intercept, Slope: 11.4100 2.72800 > Y %. (X,.1) > 2.72598 11.3667 > > Translating it to J > f=: 4 : '| (Y-(y+x*X))' > > f amoeba 1e_12 (X,.Y) > |assertion failure > | (1=-/$y)*.2=#$y > > > I'm stuck on the point that the shape of the y > > Per amoeba.ijs: > NB. y is defined to be a simplex, that is, it is n+1 points in a > n-dimensional > NB. space. So, the shape of y is (n+1),n. > > 1.) I'm not sure how I can convert the simple regression example to this > format. Can it be done? > 2.) Can you provide some tips on how to restructure my problem for this? I > think my cost function may be OK as it seems conceptually similar to the > other amoeba example of minimizing the error > > cost=: 3 : 0 > NB. find the odometer multiplier closest to the current > flm=: lm ((],&0) {~ ([ I.~ ])) y > ((tp-(+/ l*flm*w))^2),y > ) > > > > Thank you > > > > > On Wed, Apr 8, 2015 at 5:12 AM, Henry Rich <[email protected]> wrote: > >> 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 >> > > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
