20x speedup sounds pretty good to me. I was going to say, "Come on! You can 
do better than that!" but was afraid the sarcasm wouldn't come across as 
intended :)

Nice work and hope to see more from you. I'm sure I can learn a lot :)

On Monday, May 23, 2016 at 11:37:45 PM UTC+8, Gabriel Gellner wrote:
>
> Okay so I have completely hand coded the cov/var calculation to avoid any 
> overhead, and now I get around the 20x speedup you mentioned. I really 
> don't see any significant benefit of returning a tuple, allocating the 2 
> element array has an insignificant overhead even for flot64 vectors of size 
> 100000 inside hot loops. I really don't like the ugly output and lack 
> definitions of arithmatic that returning the tuple forces for no clear 
> benefit in my mind. If this is really wanted I would much rather have a 
> linreg! method, so that the default behavior is not effected by this 
> optimization. I will of course change this if the will of the people is to 
> have a tuple, but I am -1.
>
> Another quick question do I make a new issue/pull request for this 
> behavior? As it is no longer the trivial change of my current pull request. 
> Also should this function be moved out of linalg.jl since it is really not 
> using the linear algebra routines anymore?
>
> The code I have come up with is:
>
> function linreg5{S <: Number, T <: Number}(x::AbstractArray{S}, 
> y::AbstractArray{T})
>     n = length(x)
>     @assert n == length(y)
>     mx = mean(x) # need to know this at each step so calculate before
>     tot_dx = 0.0
>     tot_y = 0.0
>     tot_xy = 0.0
>     for i in 1:n
>         tot_dx += (x[i] - mx)^2
>         tot_y += y[i]
>         tot_xy += x[i]*y[i]
>     end
>     b1 = (tot_xy - mx*tot_y)/tot_dx # a 1\n cancels in the top and bottom
>     b0 = tot_y/n - b1*mx
>     return [b0, b1]
> end
>
> If anyone has any comments on what could be made better.
>
> Thanks,
> Gabriel
>
> On Monday, May 23, 2016 at 5:58:37 AM UTC-7, Andreas Noack wrote:
>>
>> Almost, but return a tuple instead of an array to avoid array allocation. 
>> Tight now, cov allocates temporary arrays for the demeaned vectors but that 
>> should probably be changed later anyway.
>>
>> On Monday, May 23, 2016 at 2:50:34 AM UTC-4, Gabriel Gellner wrote:
>>>
>>> So I am not able to get such a dramatic speed up. Do you mean something 
>>> beyond:
>>>
>>> function linreg2{S <: Number, T <: Number}(x::AbstractArray{S}, 
>>> y::AbstractArray{T})
>>>     mx = mean(x)
>>>     my = mean(y)
>>>     b1 = Base.covm(x, mx, y, my)/varm(x, mx)
>>>     b0 = my - b1*mx
>>>     return [b0, b1]
>>> end
>>>
>>> Which I find speeds up around 3x, or do you mean writing a custom cov 
>>> function that is smarter about memory? (I am returning an array as I like 
>>> to be able to do vector math on the coefficients ... but if I return a 
>>> tuple it isn't much faster for me)
>>>
>>> On Sunday, May 22, 2016 at 8:37:43 PM UTC-7, Andreas Noack wrote:
>>>>
>>>> I don't think that linreg has received much attention over the years. 
>>>> Most often it is almost as simple to use \. It you take a look at 
>>>> linreg then I'd suggest that you try to write in terms of cov and var and 
>>>> return a tuple instead of an Array. That will speed up the computation 
>>>> already now and with an unallocating cov, I see 20x speed up over linreg 
>>>> for n=10000 and Float64 element on 0.4.
>>>>
>>>> On Saturday, May 21, 2016 at 2:33:20 PM UTC-4, Gabriel Gellner wrote:
>>>>>
>>>>>
>>>>>
>>>>> I think it's an error.  The method definition should probably just be:
>>>>>>
>>>>>> linreg{T<:Number,S<:Number}(X::AbstractVector{T}, 
>>>>>> y::AbstractVector{S}) = [ones(T, size(X,1)) X] \ y
>>>>>>
>>>>>> which will allow it to work for X and y of different types.
>>>>>>
>>>>>> Is using the more specific typing (<: Number) the current best 
>>>>> practices? I notice a lot of the methods in linalg/generics.jl just check 
>>>>> for AbstractVectors etc without requiring numeric types even though that 
>>>>> would be the more correct check.
>>>>>  
>>>>>
>>>>>> A PR (pull request) with a patch and a test case would be most 
>>>>>> welcome.
>>>>>>
>>>>> On it! Taking me a bit of sweat to figure out the build process and 
>>>>> github stuff but once I have that all sorted a PR will be submitted. 
>>>>> Thanks 
>>>>> for the quick response. 
>>>>>
>>>>

Reply via email to