2011-05-25 22 views
8

Hay una biblioteca de Ruby que me permite hacer una aproximación lineal o no lineal de mínimos cuadrados de un conjunto de datos.Biblioteca de Ruby para hacer Aproximación de Mínimos Cuadrados lineales o no lineales?

Lo que me gustaría hacer es la siguiente:

  • dado una serie de [x, y] puntos de datos
  • generar un lineal o lineal de aproximación por mínimos cuadrados no en contra de que los datos
  • El La biblioteca no tiene que averiguar si necesita hacer una aproximación lineal o no lineal. La persona que llama de la biblioteca debe saber qué tipo de regresión necesitan

Preferiría no tener que intentar portar alguna biblioteca C/C++/Java para obtener esta funcionalidad, así que espero que exista alguna. Ruby lib que puedo usar.

+0

¿Has intentado leer http://stackoverflow.com/questions/703717/anything-like-scipy-in-ruby y http://stackoverflow.com/questions/5416655/ruby-mathematic-gem y http://stackoverflow.com/questions/4775013/scientific-programming-with-ruby? –

+0

Lo hice y leo a través de esas bibliotecas y solo la biblioteca linalg implica que puede hacer mínimos cuadrados aproximadamente, pero cuando busqué en la fuente no pude encontrar una implementación. –

+0

Podría haber sido una buena idea mencionar eso en su pregunta. –

Respuesta

5

Utilicé this snippet para calcular algunas regresiones. El primer parámetro es un conjunto que contiene las coordenadas x, el segundo un conjunto que contiene las coordenadas y y el último es el grado del polinomio que está buscando. No estoy seguro de si es esto lo que está buscando, pero espera que ayude.

7

Pruebe usar la gema "statsample". Puede realizar transformaciones logarítmicas, exponenciales, de potencia o cualquier otra mediante el ejemplo que se proporciona a continuación. Espero que esto ayude.

require 'statsample' 

# Independent Variable 
x_data = [Math.exp(1), Math.exp(2), Math.exp(3), Math.exp(4), Math.exp(5)] 

# Dependent Variable 
y_data = [3, 5, 7, 9, 11] 

# Logarithmic Transformation of X data 
# Math.log in Ruby has the base of Euler's number 'e' ~= '2.71828', 
# instead of the base '10'. Just a note. 
log_x_data = x_data.map { |x| Math.log(x) } 

# Linear Regression using the Logarithmic Transformation 
x_vector=log_x_data.to_vector(:scale) 
y_vector=y_data.to_vector(:scale) 
ds={'x'=>x_vector,'y'=>y_vector}.to_dataset 
mlr=Statsample::Regression.multiple(ds,'y') 
mlr.summary 

# Provides the value of the y-intercept 
#p mlr.constant 

# Lists the coefficients of each casual variable. In this case, we have only one--'x'. 
#p mlr.coeffs 

# The regression output produces the line y = 1 + 2*x, but 
# considering that we transformed x earlier, it really produces 
# y = 1 + 2*ln(x). 
Cuestiones relacionadas