Trung bình di chuyển lặp


13

Nếu chúng ta có một danh sách, giả sử danh sách đó [9, 2, 4, 4, 5, 5, 7], chúng ta có thể thực hiện một trung bình di chuyển trên nó.

Lấy một cửa sổ nói, 3 phần tử, mỗi phần tử được thay thế bằng một cửa sổ như: [[9], [9, 2], [9, 2, 4], [2, 4, 4], [4, 4, 5], [4, 5, 5], [5, 5, 7]]và sau đó lấy trung bình, chúng tôi nhận được [9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667].

Khá đơn giản cho đến nay. Nhưng một điều bạn có thể nhận thấy về điều này là việc lấy trung bình di chuyển "làm mịn" danh sách. Vì vậy, điều này đặt ra câu hỏi: một người phải lấy trung bình di chuyển bao nhiêu lần để làm cho danh sách "đủ mượt"?

Nhiệm vụ của bạn

Đưa ra một danh sách các số float, kích thước cửa sổ số nguyên và số float, xuất ra số lần người ta phải lấy trung bình di chuyển để có độ lệch chuẩn nhỏ hơn số float đó. Đối với những người không biết, độ lệch chuẩn đo lường mức độ không mượt của một tập hợp dữ liệu và có thể được tính theo công thức sau:

stddev

Ví dụ: bằng cách sử dụng danh sách trước đó của chúng tôi và số lượng tối đa .5, chúng tôi nhận được các 8lần lặp giống như thế này:

[9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667]
[9.0, 7.25, 6.5, 4.6111111111111116, 4.2222222222222223, 4.1111111111111107, 4.8888888888888893]
[9.0, 8.125, 7.583333333333333, 6.1203703703703702, 5.1111111111111107, 4.3148148148148149, 4.4074074074074074]
[9.0, 8.5625, 8.2361111111111107, 7.2762345679012341, 6.2716049382716044, 5.1820987654320989, 4.6111111111111107]
[9.0, 8.78125, 8.5995370370370363, 8.024948559670781, 7.2613168724279831, 6.2433127572016458, 5.3549382716049374]
[9.0, 8.890625, 8.7935956790123466, 8.4685785322359397, 7.9619341563786001, 7.1765260631001366, 6.2865226337448554]
[9.0, 8.9453125, 8.8947402263374489, 8.7175997370827627, 8.4080361225422955, 7.8690129172382264, 7.141660951074531]
[9.0, 8.97265625, 8.9466842421124824, 8.8525508211400705, 8.6734586953208357, 8.3315495922877609, 7.8062366636183507]

và kết thúc với một stdev của 0.40872556490459366. Bạn chỉ cần đầu ra 8.

Nhưng có một nhược điểm:

Câu trả lời không phải là không âm! Nếu danh sách ban đầu đã thỏa mãn stddev tối đa, bạn phải xem bạn có thể "quay ngược" bao nhiêu lần và hoàn tác trung bình di chuyển và vẫn có danh sách thỏa mãn stddev tối đa. Vì chúng tôi đang cắt bớt các cửa sổ cho các nđiểm dữ liệu ban đầu và không bỏ các điểm đó, nên có đủ dữ liệu để đảo ngược trung bình di chuyển.

Ví dụ: nếu chúng tôi bắt đầu với danh sách [9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627](lấy từ ví dụ trước của chúng tôi với 3 trung bình di chuyển được thực hiện cho nó) và cùng kích thước cửa sổ và max stddev, bạn sẽ xuất ra -3vì bạn có thể đảo ngược trung bình di chuyển nhiều 3lần.

Bất kỳ định dạng I / O hợp lý là tốt.

Đây là để mã ngắn nhất tính theo byte thắng!

Các trường hợp thử nghiệm

[9, 2,  4,  4,  5,  5,  7], 3, .5 -> 8
[9, 2,  4,  4,  5,  5,  7], 3, .25 -> 9
[9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627], 3, .5 -> -3
[1000, 2,  4,  4,  5,  5,  7], 7, .25 -> 13
[1000.0, 999.98477172851563, 999.96956668760447, 999.95438464397, 999.90890377378616, 999.83353739825293, 999.69923168916694], 4, 7 -> -6


Câu trả lời:


1

Sói - 236

Khá clunky ngay bây giờ, nhưng ít nhất nó hoạt động.

f[x_,w_,c_]:=Module[{l=Length,d=Sqrt@CentralMoment[#,2]&,n,a,b,t,r},n=Length@x;a=Normalize/@LowerTriangularize@Array[Boole[Abs[#1-#2]<w]&,{n,n}]^2;{b,t,r}=If[d@x>c,{a,d@#>c&,l@#-1&},{Inverse@a,d@#<c&,-l@#+2&}];r@NestWhileList[b.#&,x,t]]

236 byte,f[x_,w_,c_]:=Module[{l=Length,d=Sqrt@CentralMoment[#,2]&,n,a,b,t,r},n=Length@x;a=Normalize/@LowerTriangularize@Array[Boole[Abs[#1-#2]<w]&,{n,n}]^2;{b,t,r}=If[d@x>c,{a,d@#>c&,l@#-1&},{Inverse@a,d@#<c&,-l@#+2&}];r@NestWhileList[b.#&,x,t]]
CalculatorFeline
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.