문제

수치 데이터에 대해 평균, 표준 편차, 중앙값 등을 계산해야합니다. 내가 사용할 수있는 좋은 오픈 소스 .NET 라이브러리가 있습니까? 나는 nmath를 발견했지만 무료는 아니며 내 필요에 대해 과잉 일 수 있습니다.

도움이 되었습니까?

해결책

CodeProject 웹 사이트에서 이것을 찾았습니다. 대부분의 기본 통계 기능을 처리하기에 좋은 C# 클래스처럼 보입니다.

다른 팁

조심해야합니다. 플로팅 포인트 산술이 완벽한 경우 동일한 대답을 제공하는 표준 편차를 계산하는 방법에는 여러 가지가 있습니다. 일부 데이터 세트는 모두 정확하지만 일부 상황에서는 다른 데이터 세트보다 훨씬 낫습니다.

여기서 제안한 방법은 나쁜 답변을 줄 가능성이 가장 높은 방법입니다. 나는 그것이 나에게 추락 할 때까지 직접 사용했다.

보다 표준 편차를 계산하는 세 가지 방법을 비교합니다.

살펴보십시오 Mathnet 통계를위한 것은 아니지만 원하는 것에 유용한 기능이있을 수 있습니다.

아파치 수학 .common 그리고 그것을 통과하십시오 IKVM.

나는 내 자신의 글을 쓰는 것이 더 빠르다고 결정했다. 코드는 다음과 같습니다 ...

/// <summary>
/// Very basic statistical analysis routines
/// </summary>
public class Statistics
{
    List<double> numbers;
    public double Sum { get; private set; }
    public double Min { get; private set; }
    public double Max { get; private set; }
    double sumOfSquares;

    public Statistics()
    {
        numbers = new List<double>();
    }

    public int Count
    {
        get { return numbers.Count; }
    }

    public void Add(double number)
    {
        if(Count == 0)
        {
            Min = Max = number;
        }
        numbers.Add(number);
        Sum += number;
        sumOfSquares += number * number;
        Min = Math.Min(Min,number);
        Max = Math.Max(Max,number);            
    }

    public double Average
    {
        get { return Sum / Count; }
    }

    public double StandardDeviation
    {
        get { return Math.Sqrt(sumOfSquares / Count - (Average * Average)); }
    }

    /// <summary>
    /// A simplistic implementation of Median
    /// Returns the middle number if there is an odd number of elements (correct)
    /// Returns the number after the midpoint if there is an even number of elements
    /// Sorts the list on every call, so should be optimised for performance if planning
    /// to call lots of times
    /// </summary>
    public double Median
    {
        get
        {
            if (numbers.Count == 0)
                throw new InvalidOperationException("Can't calculate the median with no data");
            numbers.Sort();
            int middleIndex = (Count) / 2;
            return numbers[middleIndex];
        }
    }
}

aforge.net 히스토그램, 평균, 중앙값, stddev, 엔트로피와 같은 몇 가지 기본 통계 기능을 제공하는 aforge.math 네임 스페이스가 있습니다.

일회성 숫자 크런치를 수행 해야하는 경우 스프레드 시트가 멀리 떨어져 있습니다. C#에서 간단한 CSV 파일을 뱉어내는 것은 사소한 일입니다. 그런 다음 Excel (또는 무엇이든)에로드 할 수 있습니다.

class Program
{
    static void Main(string[] args)
    {
        using (StreamWriter sw = new StreamWriter("output.csv", false, Encoding.ASCII))
        {
            WriteCsvLine(sw, new List<string>() { "Name", "Length", "LastWrite" });

            DirectoryInfo di = new DirectoryInfo(".");
            foreach (FileInfo fi in di.GetFiles("*.mp3", SearchOption.AllDirectories))
            {
                List<string> columns = new List<string>();
                columns.Add(fi.Name.Replace(",", "<comma>"));
                columns.Add(fi.Length.ToString());
                columns.Add(fi.LastWriteTime.Ticks.ToString());

                WriteCsvLine(sw, columns);
            }
        }
    }

    static void WriteCsvLine(StreamWriter sw, List<string> columns)
    {
        sw.WriteLine(string.Join(",", columns.ToArray()));
    }
}

그런 다음 'Excel output.csv'를 시작하고 "= median (b : b)", "= 평균 (b : b)", "= stdev (b : b)"와 같은 함수를 사용할 수 있습니다. 차트, 히스토그램 (분석 팩을 설치하는 경우) 등을 얻습니다.

위의 내용은 모든 것을 처리하지는 않습니다. 일반화 된 CSV 파일은 생각보다 더 복잡합니다. 그러나 내가하는 많은 분석에 대해서는 "충분하다".

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top