أفضل طريقة لاستخدام وظائف Math.net إحصائيات على خصائص الكائنات في قائمة

StackOverflow https://stackoverflow.com//questions/22012737

سؤال

أحاول اكتشاف أفضل طريقة لإجراء عملية حسابية بسرعة وأردت معرفة نوع النهج الذي يتبعه الأشخاص عادةً في موقف كهذا.

لدي قائمة بالكائنات التي لها خصائص أريد حساب المتوسط ​​والانحراف المعياري لها.اعتقدت باستخدام هذا من المحتمل أن تكون مكتبة Math.NET أسهل/محسنة للأداء.

لسوء الحظ، وسيطات الإدخال لهذه الوظائف هي المصفوفات.هل الحل الوحيد هو كتابة وظيفتي الخاصة لحساب الوسائل والأمراض المنقولة جنسيًا؟هل يمكنني كتابة نوع من طريقة التمديد للقوائم التي تستخدم وظائف لامدا مثل هنا؟أم أنه من الأفضل أن أقوم بكتابة الدوال التي تُرجع صفائف من خصائص الكائنات الخاصة بي وأستخدمها مع Math.NET.

يفترض أن الإجابة تعتمد على بعض الأشياء مثل حجم القائمة؟لنفترض على سبيل الجدال أن القائمة تحتوي على 50 عنصرًا.ما يقلقني هو الأداء البحت.

هل كانت مفيدة؟

المحلول

ArrayStatistics تتوقع بالفعل المصفوفات كما تم تحسينها لهذه الحالة الخاصة (ولهذا السبب يطلق عليها اسم ArrayStatistics).بصورة مماثلة، StreamingStatistics تم تحسينه لتدفق التسلسل IEnumerable دون الاحتفاظ بالبيانات في الذاكرة.الفئة العامة التي تعمل مع جميع أنواع المدخلات هي Statistics فصل.

هل تأكدت من أن استخدام LINQ وStreamingStatistics ليس بالسرعة الكافية في حالة الاستخدام الخاصة بك؟إن حساب هذه الإحصائيات لقائمة مكونة من 50 إدخالاً فقط لا يكاد يكون قابلاً للقياس على الإطلاق، إلا إذا قلت أنك تفعل ذلك مليون مرة في حلقة واحدة.

مثال مع Math.net Numerics v3.0.0-alpha7 ، باستخدام tuples في قائمة لمحاكاة أنواعك المخصصة:

using MathNet.Numerics.Statistics;

var data = new List<Tuple<string, double>>
{
    Tuple.Create("A", 1.0),
    Tuple.Create("B", 2.0),
    Tuple.Create("C", 1.5)
};

// using the normal extension methods within `Statistics`
var stdDev1 = data.Select(x => x.Item2).StandardDeviation();
var mean1 = data.Select(x => x.Item2).Mean();

// single pass variant (unfortunately there's no single pass MeanStdDev yet):
var meanVar2 = data.Select(x => x.Item2).MeanVariance();
var mean2 = meanVar2.Item1;
var stdDev2 = Math.Sqrt(meanVar2.Item2);

// directly using the `StreamingStatistics` class:
StreamingStatistics.MeanVariance(data.Select(x => x.Item2));

نصائح أخرى

الحل الأسهل الذي يمكنك استخدامه هو وضع لينك بحيث تحول List ل مجموعة مصفوفة

  List<SomeClass> list = ...

  GetMeanAndStdError(list.ToArray()); // <- Not that good performance

ومع ذلك، إذا كان الأداء هو ما يقلقك، فمن الأفضل أن تقوم بحساب المتوسط ​​والتباين بشكل صريح (اكتب وظيفتك الخاصة):

  List<SomeClass> list = ...

  Double sumX = 0.0;
  Double sumXX = 0.0;

  foreach (var item in list) {
    Double x = item.SomeProperty;

    sumX += x;
    sumXX += x * x;
  }

  Double mean = sumX / list.Count;
  Double variance = (sumXX / list.Count - mean);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top