2013-04-23 42 views
5

Vì vậy, tôi đã gặp một vấn đề ngày hôm nay trong việc xây dựng một máy Boltzmann bị hạn chế nên tầm thường, nhưng có vẻ khó khăn. Về cơ bản, tôi đang khởi tạo giá trị 2k để tăng gấp đôi ngẫu nhiên từ 0 đến 1.Tính toán trung bình hình học của một danh sách dài ngẫu nhiên đôi

Điều tôi muốn làm là tính trung bình hình học của tập dữ liệu này. Vấn đề tôi đang gặp phải là do tập dữ liệu quá dài nên việc nhân tất cả mọi thứ lại với nhau sẽ luôn dẫn đến số không, và thực hiện root thích hợp ở mọi bước sẽ chỉ đường sắt đến 1.

Tôi có thể sắp xếp danh sách lên, nhưng tôi nghĩ rằng đó là thực sự tổng. Bất kỳ ý tưởng về cách làm điều này một cách thanh lịch?

Về lý thuyết, tôi muốn mở rộng mã RBM hiện tại của mình để có gần hơn 15k mục nhập và có thể chạy RBM trên nhiều luồng. Đáng buồn thay quy tắc này ra khỏi toán học commache apache (phương pháp hình học trung bình là không đồng bộ), longs.

+0

Số được siêu nhỏ và tôi đang tìm kiếm một giải pháp lâu dài hơn. Tôi có kế hoạch thử một cái gì đó tương tự với một danh sách gần 15k và tôi muốn một giải pháp mà cũng làm việc với điều đó. –

+1

https://en.wikipedia.org/wiki/Geometric_mean#Calculation – nhahtdh

Trả lời

11

Wow, sử dụng loại thập phân lớn là cách quá mức cần thiết!

Chỉ lấy logarit của mọi thứ, tìm giá trị trung bình của số học và sau đó là lũy thừa.

0

Có vẻ như sau khi có đủ số phép nhân thì độ chính xác kép không đủ nữa. Có quá nhiều số 0 ở đầu nếu bạn muốn.

The wiki page on arbitrary precision arithmetic hiển thị một số cách để giải quyết vấn đề. Trong Java, BigDecimal dường như là con đường để đi, mặc dù với chi phí của tốc độ.

1

Giải pháp logarit của Mehrdad chắc chắn hoạt động. Bạn có thể làm điều đó nhanh hơn (và có thể chính xác hơn), mặc dù:

  1. Tính tổng các số mũ, nói S.
  2. Cắt tất cả các số mũ thành 0 để mỗi số nằm trong khoảng từ 1/21.
  3. Nhóm các số thành các chùm tối đa 1000.
    • Đối với mỗi nhóm, tính sản phẩm của các số. Điều này sẽ không bị tràn.
    • Thêm số mũ của sản phẩm vào S và giảm số mũ bằng 0.
  4. Bạn hiện có khoảng 1/1000 số lượng. Lặp lại các bước 2 và 3 trừ khi bạn chỉ có một số.
  5. Gọi một số còn lại T. Giá trị trung bình hình học là T1/NS/N, trong đó N là kích thước của đầu vào.
+0

Tôi không rõ ràng về quy trình của bạn ở đây, bạn đang nói đến những số mũ nào? Ngoài ra nhân 1000 số ngẫu nhiên với nhau sẽ hoàn toàn bị tràn. Theo thứ tự 10^-300. Có lẽ một vài đơn đặt hàng của cường độ thấp hơn. –

+0

@SlaterTyranus: "Số mũ" ở đây có nghĩa là phần số mũ của phần tử đôi --- phần không phải là dấu bit hoặc là meaningand. Nhân 1000 đôi giữa 1/2 và 1 sẽ không bị tràn vì số mũ đại diện nhỏ nhất nhỏ hơn -1000; đó là lý do tại sao tôi chọn 1000. – tmyklebu

+0

Tôi tin rằng số mũ nhỏ nhất thực sự là theo thứ tự -300. http://www.cplusplus.com/forum/general/53760/, điều này đặt vấn đề này có nguy cơ bị tràn, mặc dù trong các lô nhỏ hơn, nó sẽ ổn. Bạn có chạy điểm chuẩn về điều này không? Nó không phải là một giải pháp thanh lịch, nhưng nếu hiệu suất đạt được là đáng kể tôi sẽ sẵn sàng để chuyển đổi. Trực giác của tôi nói nó sẽ chậm hơn, nhưng tôi không biết một số tiền khổng lồ về logarit tích hợp của Java. –

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