Ajudar a escrever uma regressão linear - página 6

 

Provavelmente, o melhor neste caso é encontrar a média aritmética de todos os X[i], subtraí-la dos próprios valores, calcular os coeficientes de regressão e corrigi-los novamente. Em princípio, nada impede que você faça o mesmo com Y[i]. Mas eu não tentei encontrar a fórmula, embora obviamente não seja difícil. Há obviamente algum truque com matrizes fracamente condicionadas.

P.S. Você também pode normalizar as séries de dados para aproximadamente a mesma ordem.

 
Mathemat писал (а) >>

Provavelmente, o melhor neste caso é encontrar a média aritmética de todos os X[i], subtraí-la dos próprios valores, calcular os coeficientes de regressão e corrigi-los novamente. Em princípio, nada impede que você faça o mesmo com Y[i]. Mas eu não tentei encontrar a fórmula, embora obviamente não seja difícil. Há obviamente algum truque com matrizes fracamente condicionadas.

P.S. Você também pode normalizar as séries de dados para aproximadamente a mesma ordem.

E eu tenho e sugeri através do MOJ. Fórmula direta, sem necessidade de correção.

Agora você também pode colocar o ACF na base de código. Verificado novamente, tudo coincide com uma precisão de 8 caracteres, mas é mais provável que isso se deva à entrada nos valores do arquivo de ACF calculados em MQL.

 

Sergei, eu já tropecei nisto alguns anos atrás quando estava escrevendo meu LR. A saída é simples - ouça a recomendação do Candidato. A única coisa que eu especificaria nesta recomendação é subtrair não o Tempo [Bars-1], mas o tempo do primeiro valor X[]. Em primeiro lugar, ele torna o código de procedimento universal desde que o X de início é movido dentro do procedimento. Em segundo lugar, se houver muitas barras no gráfico (3 anos são 1000000 minutos, ou seja, 60000000 segundos), então, subtrair o tempo da primeira barra no gráfico não mudará fundamentalmente a situação. Em terceiro lugar, você poderá voltar a suas fórmulas originais sem nenhum MOs, o que significa que você será capaz de remover a repetição de ciclos, mantendo a precisão.

Mais uma coisa. Notei que seu X[] é a hora da ata. Ou seja, os X estão dispostos de forma equidistante. O que significa que você pode fugir completamente do tempo e usar o número da barra. Se você fizer esta transição, tudo será contado com precisão e rapidez. Você pode verificar. Isto também é preferível do ponto de vista de que seu LR trabalhará o mesmo em M1 e D1 (imagine como os valores X em D1 serão diferentes se for Tempo, e não número de barras).

 
Yurixx писал (а) >>

Sergei...

Obrigado. Experimentei tudo.

Eu acabei de expor minha versão do cálculo, talvez alguém o considere útil. Eu não preciso mover nada. Não me sinto confortável em mudar X para 0. Eu uso esta função para calcular ACF, ela deve ser limitada no tempo (há algumas dependências).

 

Em geral, não há necessidade de mover o próprio X para o ponto 0. Para isso, é suficiente utilizar uma matriz interna deslocada por X[1] na função LR em vez do próprio X. Você pode até mesmo prescindir de uma matriz - basta subtrair o valor de X[1] no momento em que as somas são calculadas.

A propósito, se você tentou, isso não ajudou?

 
Yurixx писал (а) >>

Em geral, não há necessidade de mover o próprio X para o ponto 0. Para isso, é suficiente utilizar uma matriz interna deslocada por X[1] na função LR em vez do próprio X. Você pode até mesmo prescindir de uma matriz - basta subtrair o valor de X[1] no momento em que as somas são calculadas.

A propósito, se você tentou, será que funcionou?

Eu tentei e parece funcionar. Mas existe uma nuança. Se o algoritmo der tal erro para um conjunto de 6 números, não temos nenhuma garantia de que o erro não se acumulará mesmo com uma compensação. A matriz com a qual eu trabalho é 7200 (minutos). Foi por isso que encontrei este algoritmo, e ele funciona corretamente. Eu tive que desistir do outro, porque não confio mais nele.

//+------------------------------------------------------------------+
//| Формула предлагаемая мной                                        |
//| Рассчет коэффициентов A и B в уравнении                          |
//| y(x)=A*x+B                                                       |
//| используються формулы https://forum.mql4.com/ru/10780/page5       |
//+------------------------------------------------------------------+

void LinearRegr(double X[], double Y[], int N, double& A, double& B)
{
      double mo_X = 0.0, mo_Y = 0.0, var_0 = 0.0, var_1 = 0.0;
      
    for ( int i = 0; i < N; i ++ )
      {
        mo_X +=X[i];
        mo_Y +=Y[i];
      }
    mo_X /=N;
    mo_Y /=N;
        
    for ( i = 0; i < N; i ++ )
      {
        var_0 +=(X[i]-mo_X)*(Y[i]-mo_Y);
        var_1 +=(X[i]-mo_X)*(X[i]-mo_X);
      }
        A = var_0 / var_1;
        B = mo_Y - A * mo_X;
}

>> Eu não preciso de turnos.

 

Não há problema, Sergei, use o que você quiser. Quero apenas chamar sua atenção para um pequeno detalhe.

Como você certamente entende, o MO está entre o máximo e o mínimo para qualquer fila. Seu código na verdade significa mover a origem para [mo_X, mo_Y]. E para fazer isso, você percorre todos os seus 7200 valores. E então você subtrai, enquanto calcula as somas, as coordenadas do ponto zero das coordenadas da linha. Você pode também tomar qualquer ponto em uma série [Xm, Ym] como origem e realizar o cálculo do segundo ciclo, substituindo [mo_X, mo_Y] por [Xm, Ym].

O parâmetro A de uma regressão linear é invariante no que diz respeito às transferências de origem. MO não tem nada a ver com isso.

Você pode verificar este fato em 3 minutos no papel.

É por isso que o ciclo de cálculo de RI é desnecessário. Só precisamos trazer os valores de X e Y para fechar os pedidos.

 
Prival писал (а) >>

Se o algoritmo der tal erro para um conjunto de 6 números, não há garantia de que o erro não se acumulará mesmo com uma compensação.

A questão aqui não é o número de números, mas o fato de que em cada um desses 6 se encontra como um aditivo permanente (inútil) 1216600000. Ela simplesmente não contém qualquer informação. Mas são 10 dígitos significativos. Que sejam 9, o último 0 não é informativo porque todos os 6 também estão presentes. Ao quadrado, este lixo irá bloquear 17 dígitos significativos da mantissa. E são apenas 15. Ou seja, ele despejará os dígitos mais baixos (pelo banheiro). Entretanto, são estes dígitos descartados que contêm as informações necessárias (eles contêm parte das informações sobre o componente variável X).

 

Então eu não inventei esta fórmula. Está nos livros. E dessa fórmula, que utiliza quadrados, esta é derivada (sem quadrados). Basta sentar-se com um lápis. Quando chegar ao scanner, postarei uma página de Tikhonov V.I. "Statistical Radio Engineering" p.446.

 
Exatamente, basta sentar com um lápis e você verá que se você substituir Xi -> Xi-X0 e Yi -> Yi-Y0 em sua fórmula original para a inclinação b, então esta nova fórmula é equivalente à fórmula original. Para quaisquer valores de X0 e Y0. Portanto, as somas Xi e Yi (que é o cálculo MO) podem ser movidas dentro do segundo ciclo, o que reduz pela metade o tempo de cálculo do LR. E para obter precisão, devemos escolher o X0 e Y0 adequados. E é melhor fazer isso para que as ordens das séries X e Y estejam mais próximas uma da outra.
Razão: