Ir para o conteúdo
Vanessa Estima

Regressão Linear

Mensagens Recomendadas

Vanessa Estima

Boa tarde,

Tenho um problema e precisava de ajuda.

Tenho um ficheiro .dat com duas colunas (x e y) e queria, em c++, através da regressão linear, encontrar o valor do declive e da constante. Ja tentei algumas coisas mas nao esta a resultar :x

alguem sabe como fazer?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

alguem sabe como fazer?

Sim, já o Gauss sabia em 1795 :)

Hint: publica o teu código para ajudas/sugestoes especificas.

Editado por pmg
hint

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Vanessa Estima

encontrei isto na net

class LinearRegression
{
 public:
		 // Constructor using an array of Point2D objects
		 // This is also the default constructor
		 LinearRegression(Point2D *p = 0, long size = 0);
		 // Constructor using arrays of x values and y values
		 LinearRegression(double *x, double *y, long size = 0);
		 virtual void addXY(const double& x, const double& y);
		 void clear() { sumX = sumY = sumXsquared = sumYsquared = sumXY = n = 0; }
		 void addPoint(const Point2D& p) { addXY(p.getX(), p.getY()); }
		 // Must have at least 3 points to calculate
		 // standard error of estimate. Do we have enough data?
		 int haveData() const { return (n > 2 ? 1 : 0); }
		 long items() const { return n; }
		 virtual double getA() const { return a; }
		 virtual double getB() const { return b; }
		 double getCoefDeterm() const { return coefD; }
		 double getCoefCorrel() const { return coefC; }
		 double getStdErrorEst() const { return stdError; }
		 virtual double estimateY(double x) const { return (a + b * x); }
 protected:
		 long n;	 // number of data points input so far
		 double sumX, sumY; // sums of x and y
		 double sumXsquared, // sum of x squares
			 sumYsquared; // sum y squares
		 double sumXY; // sum of x*y
		 double a, b; // coefficients of f(x) = a + b*x
		 double coefD, // coefficient of determination
			 coefC, // coefficient of correlation
			 stdError; // standard error of estimate
		 void Calculate(); // calculate coefficients
};
LinearRegression::LinearRegression(Point2D *p, long size)
{
long i;
a = b = sumX = sumY = sumXsquared = sumYsquared = sumXY = 0.0;
n = 0L;
if (size > 0L) // if size greater than zero there are data arrays
for (n = 0, i = 0L; i < size; i++)
 addPoint(p[i]);
}
LinearRegression::LinearRegression(double *x, double *y, long size)
{
long i;
a = b = sumX = sumY = sumXsquared = sumYsquared = sumXY = 0.0;
n = 0L;
if (size > 0L) // if size greater than zero there are data arrays
for (n = 0, i = 0L; i < size; i++)
 addXY(x[i], y[i]);
}
void LinearRegression::addXY(const double& x, const double& y)
{
n++;
sumX += x;
sumY += y;
sumXsquared += x * x;
sumYsquared += y * y;
sumXY += x * y;
Calculate();
}
void LinearRegression::Calculate()
{
if (haveData())
{
if (fabs( double(n) * sumXsquared - sumX * sumX) > DBL_EPSILON)
{
 b = ( double(n) * sumXY - sumY * sumX) /
 ( double(n) * sumXsquared - sumX * sumX);
 a = (sumY - b * sumX) / double(n);
 double sx = b * ( sumXY - sumX * sumY / double(n) );
 double sy2 = sumYsquared - sumY * sumY / double(n);
 double sy = sy2 - sx;
 coefD = sx / sy2;
 coefC = sqrt(coefD);
 stdError = sqrt(sy / double(n - 2));
}
else
{
 a = b = coefD = coefC = stdError = 0.0;
}
}
}

Isto faz exactamente o que quero, que é dar me o valor do declive e o valor da constante.

a minha duvida é como vou tirando, um a um, os valores do ficheiro e guarda los num array:

// Constructor using arrays of x values and y values

LinearRegression(double *x, double *y, long size = 0);

Não sei se me estao a perceber :x

Editado por Rui Carlos
Formatação do código.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

a minha duvida é como vou tirando, um a um, os valores do ficheiro e guarda los num array

Para fazer os calculos requeridos nao precisas de meter os valores num array.

Estuda o codigo que encontraste na net (eu nao sei C++ por isso nao quero dizer asneiras --- mas parece-me que podes usar addXY() para fazer os calculos sem passar por um array --- e se nao poderes da maneira que o codigo esta neste momento, de certeza que podes alterar o codigo para funcionar).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.