JuliaStats / MultivariateStats.jl

A Julia package for multivariate statistics and data analysis (e.g. dimension reduction)
Other
375 stars 85 forks source link

Bugs in isotonic regression ? #219

Open BatyLeo opened 1 year ago

BatyLeo commented 1 year ago

Hello !

By testing the isotonic method from this package and comparing it with a custom implementation, I faced some strange behaviours.

First, the output seems to always be ordered, regardless of the first input arg x:

julia> isotonic(5:-1:1, 5:-1:1)
5-element Vector{Float64}:
 1.0
 2.0
 3.0
 4.0
 5.0

Shouldn't it return [5.0, 4.0, 3.0, 2.0, 1.0] instead ?

Second, even when using an ordered x, it seems that the output solution is often suboptimal:

julia> y = [0.52, 0.58, -1.91, -1.12, -1.04]

julia> sol = isotonic(1:length(y), y)
5-element Vector{Float64}:
 -0.8725
 -0.8725
 -0.8725
 -0.8725
 -0.8725

In this example, the output x is a worse solution than the mean of y

julia> sol_mean = fill(sum(y) / length(y), length(y))
5-element Vector{Float64}:
 -0.594
 -0.594
 -0.594
 -0.594
 -0.594

julia> sum((vi - yi) ^ 2 for (vi, yi) in zip(sol, y))
5.21453125

julia> sum((vi - yi) ^ 2 for (vi, yi) in zip(sol_mean, y))
4.826719999999999
EvoArt commented 6 months ago

I also seem to be getting incorrect outputs when fitting a MetricMDS with metric = isotonic