문제

저는 계산을 빠르게 수행하는 가장 좋은 방법을 찾아내려고 노력하고 있습니다. 어떤 종류의 접근 방식이 보통 이런 상황에서 어떤 일을하는지 알아 내고 싶었습니다.

나는 의 평균 및 표준 편차를 계산하려는 속성이있는 물체 목록을 가지고 있습니다. math.net 도서관이 더 쉽게 될 것입니다. / 성능을 위해 최적화되었습니다.

불행히도 이러한 함수의 입력 인수는 배열입니다. 수단과 성병을 계산하기 위해 내 자신의 기능을 쓰는 유일한 해결책입니까? 여기 ? 또는 내 객체 속성의 배열을 반환하고 Math.net과 함께 사용할 수있는 작성 기능을 더 잘 끕니다.

가 아마도 대답은 목록의 크기와 같은 것에 달려 있습니다. 그 목록에 50 개의 요소가 있음을 인수에게 말하자고합시다. 내 관심사는 순전히 성과가 있습니다.

도움이 되었습니까?

해결책

ArrayStatistics 실제로이 특별한 경우에 최적화 된 것처럼 배열을 기대합니다 (그래서 ArrayStatistics라고하는 이유).마찬가지로, StreamingStatistics는 메모리에 데이터를 유지하지 않고 IEnumerable 시퀀스 스트리밍에 최적화되어 있습니다.모든 종류의 입력에서 작동하는 일반 클래스는 Statistics 클래스입니다.

LINQ 및 StreamingStatistics를 사용하는 것이 사용 사례에서 충분히 빠르지 않음을 확인했습니다.단지 50 개의 항목 목록에 대해 이러한 통계를 계산하면 루프에서 백만 번만 해당하는 경우가 아니라면 전혀 측정 할 수 있습니다.

v3.0.0-alpha7의

예제, 목록의 튜플을 사용하여 사용자 정의 유형을 에뮬레이트합니다.

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));
.

다른 팁

사용할 수있는 가장 솔루션은 linq 배열로 변환하는 것입니다

  List<SomeClass> list = ...

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

그러나 Perforamance가 귀하의 우려 사항이면, 평균 및 분산을 명시 적으로 계산 (자신의 기능을 작성) :

  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