2008-09-26 43 views
23

Tôi cần tính trung bình, độ lệch chuẩn, trung vị vv cho một loạt dữ liệu số. Có một thư viện .NET nguồn mở tốt mà tôi có thể sử dụng không? Tôi đã tìm thấy NMath nhưng nó không phải là miễn phí và có thể là quá mức cần thiết cho nhu cầu của tôi.Đề nghị một Thư viện Thống kê Nguồn Mở .NET

+12

Tôi sẽ không bao giờ hiểu tại sao một số người coi đây là "không mang tính xây dựng" vì sự quan tâm và số lượng câu trả lời của nó! – Calanus

+1

@Calanus yes, kỳ quái. Rất nhiều thông tin tốt trong các câu trả lời là tốt. Có lẽ đó là vì từ "giới thiệu" trong tiêu đề. –

Trả lời

7

Tôi tìm thấy điều này trên trang web CodeProject. Nó trông giống như một lớp C# tốt để xử lý hầu hết các hàm thống kê cơ bản.

+8

Yuck! Tại sao một số người vẫn tồn tại bằng cách viết tên phương thức/lớp trong chữ thường chứ không phải PascalCase; nó chỉ làm cho mã trông sai. –

7

Có một cái nhìn tại MathNet nó không phải là đặc biệt cho thống kê, nhưng có thể có chức năng hữu ích cho những gì bạn muốn

3

Tôi quyết định viết nhanh hơn, chỉ cần làm những gì tôi cần. Đây là mã ...

/// <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]; 
     } 
    } 
} 
+5

Thuật toán đó hoạt động theo lý thuyết và thường hoạt động trong thực tế. Nhưng hãy xem bài đăng này để biết ví dụ về nơi thuật toán đó có thể thất bại. http://www.johndcook.com/blog/2008/09/26/comparing-three-methods-of-computing-standard-deviation/ –

+0

@ JohnD.Cook cảm ơn thông tin hữu ích. Đối với dữ liệu tôi đang sử dụng, phương thức trên hoạt động tốt. Làm thế nào về việc gửi cho chúng tôi một mẫu C# ngắn với thuật toán được đề xuất của bạn? –

17

Bạn phải cẩn thận. Có một số cách để tính toán độ lệch chuẩn sẽ cho cùng một câu trả lời nếu số học dấu chấm động là hoàn hảo. Tất cả chúng đều chính xác đối với một số bộ dữ liệu, nhưng một số lại tốt hơn nhiều so với các bộ dữ liệu khác trong một số trường hợp.

Phương pháp tôi đã thấy được đề xuất ở đây là phương pháp có nhiều khả năng đưa ra câu trả lời tồi nhất. Tôi đã sử dụng nó cho đến khi nó rơi vào tôi.

Xem Comparing three methods of computing standard deviation.

+1

Thông tin tốt đáng để bỏ phiếu. – mistrmark

5

Apache Maths.Common và chạy qua IKVM.

+0

Apache Maths.Common được viết nhiều hơn nhiều so với bất kỳ API thống kê nào khác mà tôi đã tìm thấy. Biên dịch nó thành một DLL .NET thông qua IKVM là một snap. Cảm ơn rất nhiều vì gợi ý! –

1

AForge.NET có không gian tên AForge.Math, cung cấp một số hàm thống kê cơ bản: Biểu đồ, trung bình, trung bình, stddev, entropy.

0

Nếu bạn chỉ cần thực hiện một số thao tác rút gọn một lần, bảng tính sẽ là công cụ tốt nhất của bạn. Đó là tầm thường để nhổ ra một tập tin đơn giản CSV từ C#, sau đó bạn có thể tải lên trong Excel (hoặc bất kỳ):

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())); 
    } 
} 

Sau đó, bạn có thể chỉ cần 'bắt đầu nổi trội output.csv' và chức năng sử dụng như "= MEDIAN (B: B) "," = AVERAGE (B: B) "," = STDEV (B: B) ". Bạn nhận được biểu đồ, biểu đồ (nếu bạn cài đặt gói phân tích), v.v.

Ở trên không xử lý mọi thứ; tệp CSV tổng quát phức tạp hơn bạn nghĩ. Nhưng đó là "đủ tốt" cho phần lớn phân tích tôi làm.

Các vấn đề liên quan