Je traite souvent certaines données par des programmes où par des données. Pour faire est simple considérons que les données sont une seule série de nombres de même ampleur. Lorsque les chiffres sont déraisonnablement élevés, il peut être utile de normaliser les données. L'une des transformations courantes consiste à soustraire la moyenne de toutes les valeurs. Après cette transformation, les données transformées auront le zéro moyen.énormes erreurs numériques lors de la tentative de normalisation des données
Une autre transformation courante qui peut être effectuée après avoir une moyenne nulle divise les données par leur écart-type. Après l'application de cette transformation, les nouvelles données ont une variance unitaire. Lorsque j'utilise des données normalisées de cette manière, je pense que les erreurs numériques devraient être plus petites. Cependant, il semble que je ne parvienne pas à faire ces transformations parce que les erreurs numériques apparaissent même lorsque j'essaie de calculer l'écart-type.
Ci-dessous est un exemple de code dans C# où j'essaie de calculer l'écart-type. On peut facilement voir même sans connaissance statistique (de la formule) que la sortie du programme devrait être nulle. (Si des données est un tableau de constantes que la moyenne des carrés des données équivaut à la case départ des moyennes.)
static double standardDeviation(double[] data)
{
double sum = 0;
double sumOfSquares = 0;
foreach (double number in data)
{
sum += number;
sumOfSquares += number * number;
}
double average = sum/data.Length;
double averageOfSquares = sumOfSquares/data.Length;
return Math.Sqrt(averageOfSquares - average * average);
}
static void Main(string[] args)
{
double bigNumber = 1478340000000;
double[] data = Enumerable.Repeat(bigNumber, 83283).ToArray();
Console.WriteLine(standardDeviation(data));
}
Au lieu de zéro, le programme fournit un grand nombre causé par des erreurs numériques: 2133383,0308878
Notez que si je omettrait Math.Sqrt (ie je calculerais la variance au lieu de l'écart-type) alors l'erreur serait beaucoup plus élevée.
Quelle est la cause et comment puis-je écrire cela avec des erreurs numériques plus smaler?
Thx pour une bonne réponse. J'aime particulièrement comment vous le faites en un seul passage. Je comprends que la moyenne est correcte. Cependant, la formule de la variance me semble erronée. Qu'en est-il de la formule suivante?'vaiance = (1.0-f) * variance + f * d * d * (1.0 + f)' Cela aurait plus de sens pour moi. –
Je suis sûr que ma formule est correcte. Votre ne peut pas être pour après le premier élément de données, lorsque f = 1, votre formule donne une valeur non nulle, 2 * d * d où d est la première valeur de données (parce que la moyenne est initialisée à 0). Mais la variance d'une collection de 1 choses est 0. – dmuir
Votre contre-exemple est exact. Ainsi est votre formule. J'ai codé le programme avec votre formule et il renvoie les valeurs attendues. J'ai donc marqué votre réponse comme acceptée. Cependant je ne vois toujours pas pourquoi cela fonctionne. –