2012-05-28 22 views
6

Tôi đã tìm kiếm cách tạo thùng cho tập dữ liệu cụ thể (bằng cách chỉ định băng tần thấp hơn, dải trên và số lượng thùng yêu cầu) bằng cách sử dụng phép toán phổ biến apache 3.0. Tôi đã xem xét tần số http://commons.apache.org/math/apidocs/org/apache/commons/math3/stat/Frequency.html nhưng nó không cho tôi những gì tôi muốn .. tôi muốn một phương pháp cho tôi tần số cho các giá trị trong một khoảng thời gian (ví dụ: có bao nhiêu giá trị nằm trong khoảng từ 0 đến 5). Bất kỳ đề xuất hoặc ý tưởng?cách tạo thùng cho biểu đồ bằng cách sử dụng apache math 3.0 trong java?

+0

Bạn có bị hạn chế sử dụng Apache không? Điều này nghe chính xác như trường hợp sử dụng cho [Guava's] (http://guava-libraries.googlecode.com) ['SortedMultiset'] (http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained# SortedMultiset). –

+0

@ Louis Wasserman vâng tôi bị hạn chế đối với Apache math 3.0, bởi vì nó cung cấp chức năng phù hợp và nội suy khác. – Sami

Trả lời

5

Theo như tôi biết không có lớp biểu đồ tốt trong Apache Commons. Tôi đã tự viết cho mình. Nếu tất cả những gì bạn muốn là các thùng phân phối tuyến tính từ min đến max, thì nó khá dễ viết.

Có lẽ một cái gì đó như thế này:

public static int[] calcHistogram(double[] data, double min, double max, int numBins) { 
    final int[] result = new int[numBins]; 
    final double binSize = (max - min)/numBins; 

    for (double d : data) { 
    int bin = (int) ((d - min)/binSize); 
    if (bin < 0) { /* this data is smaller than min */ } 
    else if (bin >= numBins) { /* this data point is bigger than max */ } 
    else { 
     result[bin] += 1; 
    } 
    } 
    return result; 
} 

Sửa: Dưới đây là một ví dụ.

double[] data = { 2, 4, 6, 7, 8, 9 }; 
int[] histogram = calcHistogram(data, 0, 10, 4); 
// This is a histogram with 4 bins, 0-2.5, 2.5-5, 5-7.5, 7.5-10. 
assert histogram[0] == 1; // one point (2) in range 0-2.5 
assert histogram[1] == 1; // one point (4) in range 2.5-5. 
// etc.. 
+0

nhưng làm thế nào sẽ nhận được tần số cho mỗi bin? Tôi không tìm thấy bất kỳ lớp hoặc phương thức nào thực hiện điều đó trong Apache Math 3.0. – Sami

+0

Tần suất cho mỗi thùng? 'result [i]' cho bạn biết có bao nhiêu điểm dữ liệu nằm trong thùng 'i'-th. Nếu bạn muốn tần số (tỷ lệ), chỉ cần làm 'kết quả [i]/data.length' ... – Max

+0

Tôi đã viết một ví dụ cho bạn. – Max

12

Đây là một cách đơn giản để thực hiện biểu đồ sử dụng Apache Commons Math 3:

final int BIN_COUNT = 20; 
double[] data = {1.2, 0.2, 0.333, 1.4, 1.5, 1.2, 1.3, 10.4, 1, 2.0}; 

long[] histogram = new long[BIN_COUNT]; 
org.apache.commons.math3.random.EmpiricalDistribution distribution = new org.apache.commons.math3.random.EmpiricalDistribution(BIN_COUNT); 
distribution.load(data); 
int k = 0; 
for(org.apache.commons.math3.stat.descriptive.SummaryStatistics stats: distribution.getBinStats()) 
{ 
    histogram[k++] = stats.getN(); 
} 
+1

Có thể nhận được biên giới khoảng cách từ EmpiricalDistribution # getUpperBounds. –

1

Tôi nghĩ rằng mã của bạn có một lỗi trong nó - vui lòng xem mã chỉnh dưới đây:

public static int[] calcHistogram(double[] data, double min, double max, int numBins) { 
    final int[] result = new int[numBins]; 
    final double binSize = (max - min)/numBins; 

    for (double d : data) { 
    int bin = (int) ((d - min)/binSize); // changed this from numBins 
    if (bin < 0) { /* this data is smaller than min */ } 
    else if (bin >= numBins) { /* this data point is bigger than max */ } 
    else { 
     result[bin] += 1; 
    } 
    } 
    return result; 
} 
+0

Cảm ơn bạn đã bắt nó! – Max

+5

Đây phải là bản chỉnh sửa câu trả lời của Max chứ không phải câu trả lời riêng biệt –