C # calcule la valeur discrète des données de dispersion

Dans un ensemble de données de positionnement, il y a une petite quantité de données libres, ce qui provoque une grande déviation des points de données, et cette méthode appelle des valeurs discrètes anormales.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HcyWinFormsApp1
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            List<double> dataList = new List<double>();
            dataList.Add(1000);
            dataList.Add(1002);
            dataList.Add(1999);
            dataList.Add(998);
            dataList.Add(1004);
            dataList.Add(201);
            dataList.Add(1006);
            dataList.Add(996);
            dataList.Add(994);
            dataList.Add(998);
            dataList.Add(992);
            dataList.Add(1889);
            dataList.Add(889);
            dataList.Add(884);

            var result= Find(dataList);

            for (int i = 0; i < result.Count; i++)
            {
                this.Invoke(new Action(() =>
                {
                    this.richTextBox1.Text +="异常值为:"+dataList[result[i]].ToString()+"\n";
                }));
            }
            
        }

        public static List<int> Find(List<double> dataList)
        {
            var indexList = new List<int>();
            var sigma = GetSigma(dataList);   //方差
            var mean = dataList.Average();  //均值
            var (lowerWhisker, upWhisker) = GetBoxPlot(dataList.OrderBy(p => p).ToList());  //箱线图的限值

            var seq = 0;
            foreach (var data in dataList)
            {
                var r = FindItem(data, sigma, mean);//正态性判断
                if (r != -1)
                    indexList.Add(seq);
                else
                {
                    r = FindItemBoxPlot(data, lowerWhisker, upWhisker); //箱线图判断
                    if (r != -1)
                        indexList.Add(seq);
                }
                seq++;
            }
            return indexList;//返回数据的位置索引集合            
        }



        public static double GetSigma(List<double> dataList)
        {
            var u = dataList.Average(); //平均值
            var sum = dataList.Sum(p => Math.Pow(p - u, 2));
            var sigma = Math.Sqrt(sum / (dataList.Count - 1));
            return sigma;
        }

        public static (double lowerWhisker, double upWhisker) GetBoxPlot(List<double> dataList)
        {
            if (!dataList.Any())
                return (default, default);
            var listCount = dataList.Count;
            double q1, q3 = 0.0;
            if ((listCount + 1) % 4 == 0)
            {
                q1 = dataList[(listCount + 1) / 4];
                q3 = dataList[3 * (listCount + 1) / 4];
            }
            else
            {
                var index1 = (int)((listCount + 1) / 4);
                var index3 = (int)(3 * (listCount + 1) / 4);
                q1 = (dataList[index1 - 1] + dataList[index1]) / 2;
                q3 = (dataList[index3 - 1] + dataList[index3]) / 2;
            }
            var iqr = q3 - q1;
            var lowerWhisker = q1 - 1.5 * iqr;
            var upWhisker = q3 + 1.5 * iqr;
            return (lowerWhisker, upWhisker);
        }

        private static int FindItem(double data, double sigma, double mean)
        {
            if (data > mean + 3 * sigma || data < mean - 3 * sigma)
                return 1;
            return -1;
        }

        private static int FindItemBoxPlot(double data, double lowerWhisker, double upWhisker)
        {
            if (data > upWhisker || data < lowerWhisker)
                return 1;
            return -1;
        }
    }
}

 Le résultat obtenu est 1999 201 1889 correct ! ! ! ! ! ! ! ! ! ! ! ! !

Le code ci-dessus est un programme écrit en C # pour détecter les valeurs aberrantes dans un ensemble de données donné. Tout d'abord, dans la fonction Form3_Load, ajoutez les données à détecter à une variable dataList de type List<double>. Ensuite, après avoir cliqué sur le bouton button1, le programme appellera la fonction Find, qui utilise deux méthodes de jugement de normalité et de jugement de boxplot pour détecter les valeurs anormales dans la dataList. Plus précisément, cette fonction calculera la variance sigma et la moyenne moyenne de la liste de données, et utilisera la fonction GetBoxPlot pour calculer les limites lowerWhisker et upWhisker de la boîte à moustaches. Ensuite, pour chaque donnée dans dataList, le programme appellera la fonction FindItem et la fonction FindItemBoxPlot pour juger s'il s'agit d'une valeur anormale, et ajoutera son index de position dans dataList à indexList. Enfin, la fonction renvoie indexList. Enfin, dans la fonction button1_Click, le programme parcourra l'indexList et affichera la valeur anormale correspondante dans la dataList du contrôle richTextBox1.

Le code ci-dessus peut détecter des points discrets dans la liste de données. Plus précisément, le programme calcule d'abord la variance et la moyenne de la liste de données, puis utilise le concept de distribution normale pour déterminer si chaque donnée est un point discret. Si une valeur s'écarte trop de la moyenne (plus de 3 écarts-types), elle est considérée comme un point discret.

De plus, le programme utilise également le concept d'une boîte à moustaches pour déterminer si les données sont un point discret. Plus précisément, le programme calcule les quartiles et les distances interquartiles des données et détermine les limites supérieure et inférieure dans la boîte à moustaches en fonction de ces données. Si la valeur d'une certaine donnée dépasse les limites supérieure et inférieure, elle est considérée comme un point discret.

Je suppose que tu aimes

Origine blog.csdn.net/u010919083/article/details/129745096
conseillé
Classement