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

Reply via email to