Aiuta a scrivere una regressione lineare - pagina 6

 

Probabilmente la cosa migliore in questo caso è trovare la media aritmetica di tutti gli X[i], sottrarla ai valori stessi, calcolare i coefficienti di regressione e correggerli di nuovo. In linea di principio, nulla vi impedisce di fare lo stesso con Y[i]. Ma non ho provato a trovare la formula, anche se ovviamente non è difficile. C'è ovviamente qualche trucco con le matrici debolmente condizionate.

P.S. Potete anche normalizzare le serie di dati a circa lo stesso ordine.

 
Mathemat писал (а) >>

Probabilmente la cosa migliore in questo caso è trovare la media aritmetica di tutti gli X[i], sottrarla ai valori stessi, calcolare i coefficienti di regressione e correggerli di nuovo. In linea di principio, nulla vi impedisce di fare lo stesso con Y[i]. Ma non ho provato a trovare la formula, anche se ovviamente non è difficile. C'è ovviamente qualche trucco con le matrici debolmente condizionate.

P.S. Potete anche normalizzare le serie di dati a circa lo stesso ordine.

E l'ho fatto e suggerito attraverso il MOJ. Formula semplice, nessuna correzione necessaria.

Ora puoi mettere anche l'ACF nella base di codice. Ricontrollato, tutto coincide con una precisione di 8 caratteri, ma è molto probabilmente dovuto all'inserimento nel file dei valori di ACF calcolati in MQL.

 

Sergei, mi sono già imbattuto in questo un paio di anni fa quando stavo scrivendo il mio LR. La via d'uscita è semplice: ascoltare la raccomandazione di Candid. L'unica cosa che vorrei specificare in questa raccomandazione è di sottrarre non Time[Bars-1], ma il tempo del primo valore X[]. In primo luogo, rende il codice della procedura universale poiché l'inizio X è spostato all'interno della procedura. In secondo luogo, se ci sono molte barre sul grafico (3 anni sono 1000000 minuti, cioè 60000000 sec), allora sottrarre il tempo della prima barra sul grafico non cambierà fondamentalmente la situazione. In terzo luogo, sarete in grado di tornare alle vostre formule originali senza alcun MO, il che significa che sarete in grado di rimuovere la ripetizione del ciclo mantenendo la precisione.

Un'altra cosa. Ho notato che la tua X[] è l'ora dei minuti. Cioè, le X sono disposte in modo equidistante. Il che significa che si può evitare del tutto il tempo e usare il numero della barra. Se fate questa transizione, tutto sarà contato accuratamente e rapidamente. Potete controllare. Questo è anche preferibile dal punto di vista che il tuo LR lavorerà allo stesso modo su M1 e D1 (immagina come saranno diversi i valori X su D1 se si tratta di Tempo e non di numero di barra).

 
Yurixx писал (а) >>

Sergei...

Grazie, ho provato tutto.

Ho appena esposto la mia versione del calcolo, forse qualcuno la troverà utile. Non ho bisogno di spostare nulla da nessuna parte. Non mi sento a mio agio a spostare X a 0. Uso questa funzione per calcolare l'ACF, dovrebbe essere legata al tempo (ci sono alcune dipendenze).

 

In generale, non è necessario spostare X stesso nel punto 0. Per fare questo, è sufficiente utilizzare una matrice interna spostata di X[1] nella funzione LR invece di X stesso. Si può anche fare a meno di un array - basta sottrarre il valore di X[1] nel momento in cui le somme vengono calcolate.

A proposito, se l'hai provato, non ti ha aiutato?

 
Yurixx писал (а) >>

In generale, non è necessario spostare X stesso nel punto 0. Per fare questo, è sufficiente utilizzare una matrice interna spostata di X[1] nella funzione LR invece di X stesso. Si può anche fare a meno di un array - basta sottrarre il valore di X[1] nel momento in cui le somme vengono calcolate.

A proposito, se l'avete provato, ha funzionato?

L'ho provato e sembra funzionare. Ma c'è una sfumatura: se l'algoritmo dà un tale errore per un array di 6 numeri, non abbiamo nessuna garanzia che l'errore non si accumuli anche con un offset. L'array con cui lavoro è di 7200 (minuti). Ecco perché ho trovato questo algoritmo, e funziona correttamente. Ho dovuto rinunciare all'altro, perché non mi fido più.

//+------------------------------------------------------------------+
//| Формула предлагаемая мной                                        |
//| Рассчет коэффициентов 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;
}

>> Non ho bisogno di turni.

 

Nessun problema, Sergei, usa quello che vuoi. Voglio solo attirare la vostra attenzione su un piccolo dettaglio.

Come certamente capite, MO è tra max e min per qualsiasi riga. Il codice che avete dato significa effettivamente spostare il punto di partenza in [mo_X, mo_Y]. E per fare questo, si fa un ciclo di tutti i valori 7200. E poi si sottraggono, mentre si calcolano le somme, le coordinate del punto zero dalle coordinate della fila. Si potrebbe anche prendere un punto qualsiasi di una serie [Xm, Ym] come origine ed eseguire il calcolo del secondo ciclo, sostituendo [mo_X, mo_Y] con [Xm, Ym].

Il parametro A di una regressione lineare è invariante rispetto ai trasferimenti di origine. Il MO non ha niente a che vedere con questo.

Puoi verificare questo fatto in 3 minuti sulla carta.

Ecco perché il ciclo di calcolo dell'IR non è necessario. Abbiamo solo bisogno di portare i valori di X e Y per chiudere gli ordini.

 
Prival писал (а) >>

Se l'algoritmo dà un tale errore per un array di 6 numeri, non c'è garanzia che l'errore non si accumuli anche con un offset.

Il problema qui non è il numero di numeri, ma il fatto che in ognuno di quei 6 si trova come additivo permanente (inutile) 1216600000. Semplicemente non contiene alcuna informazione. Ma sono 10 cifre significative. Che sia 9, l'ultimo 0 non è informativo perché sono presenti anche tutti e 6. Al quadrato, questa spazzatura bloccherà 17 cifre significative della mantissa. E ce ne sono solo 15. Cioè, scaricherà le cifre più basse (nel cesso). Nel frattempo, sono queste cifre scartate che contengono le informazioni necessarie (contengono parte delle informazioni sulla componente variabile X).

 

Quindi non ho inventato questa formula. È nei libri. E da quella formula, che usa i quadrati, si ricava questa (senza quadrati). Basta sedersi con una matita. Quando arriverò allo scanner, posterò una pagina di Tikhonov V.I. "Statistical Radio Engineering" p.446.

 
Esattamente, basta sedersi con una matita e vedrai che se sostituisci Xi -> Xi-X0 e Yi -> Yi-Y0 nella tua formula originale per la pendenza b, allora questa nuova formula è equivalente a quella originale. Per qualsiasi valore di X0 e Y0. Quindi le somme Xi e Yi (che è il calcolo MO) possono essere spostate all'interno del secondo ciclo, il che dimezza il tempo di calcolo LR. E per ottenere la precisione dovremmo scegliere X0 e Y0 adeguati. Ed è meglio farlo in modo che gli ordini delle serie X e Y siano più vicini tra loro.