Przybliżona data śmierci
Tablica umieralności lub tablica trwania życia to narzędzie aktuarialne, które podaje prawdopodobieństwo, że osoba w wieku \$A\$lata umrą w następnym roku i jest używany między innymi do obliczania składek na ubezpieczenie na życie. Jedną z pierwszych osób, które stworzyły tablicę życia, był kometarny Edmond Halley . Te prawdopodobieństwa pozwalają również oszacować długość życia w danym wieku, co jest celem tego wyzwania.
Wejście
- Liczba całkowita od 0 do 119 włącznie.
- Wskaźnik płci M / K.
Wynik
- Przybliżenie oczekiwanej długości życia dla tego wieku / płci zgodnie z tabelą śmiertelności wydaną przez Social Security Administration z 2016 r., Zwaną również tabelą aktuarialnego życia, której odpowiednią część można znaleźć poniżej.
Age M F
0 75.97 80.96
1 75.45 80.39
2 74.48 79.42
3 73.50 78.43
4 72.52 77.45
5 71.53 76.46
6 70.54 75.47
7 69.55 74.47
8 68.56 73.48
9 67.57 72.49
10 66.57 71.50
11 65.58 70.50
12 64.59 69.51
13 63.60 68.52
14 62.61 67.53
15 61.63 66.54
16 60.66 65.55
17 59.70 64.57
18 58.74 63.59
19 57.79 62.61
20 56.85 61.63
21 55.91 60.66
22 54.98 59.69
23 54.06 58.72
24 53.14 57.75
25 52.22 56.78
26 51.31 55.82
27 50.39 54.85
28 49.48 53.89
29 48.56 52.93
30 47.65 51.97
31 46.74 51.01
32 45.83 50.06
33 44.92 49.10
34 44.01 48.15
35 43.10 47.20
36 42.19 46.25
37 41.28 45.30
38 40.37 44.36
39 39.47 43.41
40 38.56 42.47
41 37.65 41.53
42 36.75 40.59
43 35.85 39.66
44 34.95 38.73
45 34.06 37.80
46 33.17 36.88
47 32.28 35.96
48 31.41 35.04
49 30.54 34.13
50 29.67 33.23
51 28.82 32.33
52 27.98 31.44
53 27.14 30.55
54 26.32 29.68
55 25.50 28.81
56 24.70 27.94
57 23.90 27.09
58 23.12 26.24
59 22.34 25.39
60 21.58 24.56
61 20.83 23.72
62 20.08 22.90
63 19.35 22.07
64 18.62 21.26
65 17.89 20.45
66 17.18 19.65
67 16.47 18.86
68 15.77 18.07
69 15.07 17.30
70 14.39 16.54
71 13.71 15.79
72 13.05 15.05
73 12.40 14.32
74 11.76 13.61
75 11.14 12.92
76 10.53 12.23
77 9.94 11.57
78 9.37 10.92
79 8.82 10.29
80 8.28 9.68
81 7.76 9.09
82 7.26 8.52
83 6.79 7.98
84 6.33 7.45
85 5.89 6.95
86 5.48 6.47
87 5.08 6.01
88 4.71 5.57
89 4.37 5.16
90 4.05 4.78
91 3.75 4.43
92 3.48 4.11
93 3.23 3.81
94 3.01 3.55
95 2.81 3.31
96 2.64 3.09
97 2.49 2.90
98 2.36 2.73
99 2.24 2.58
100 2.12 2.42
101 2.01 2.28
102 1.90 2.14
103 1.80 2.01
104 1.70 1.88
105 1.60 1.76
106 1.51 1.65
107 1.42 1.54
108 1.34 1.44
109 1.26 1.34
110 1.18 1.24
111 1.10 1.15
112 1.03 1.06
113 0.96 0.98
114 0.90 0.91
115 0.84 0.84
116 0.78 0.78
117 0.72 0.72
118 0.66 0.66
119 0.61 0.61
Dla wygody są tutaj w szerokiej formie (w kolejności 0-119 lat):
M: [75.97, 75.45, 74.48, 73.5, 72.52, 71.53, 70.54, 69.55, 68.56, 67.57, 66.57, 65.58, 64.59, 63.6, 62.61, 61.63, 60.66, 59.7, 58.74, 57.79, 56.85, 55.91, 54.98, 54.06, 53.14, 52.22, 51.31, 50.39, 49.48, 48.56, 47.65, 46.74, 45.83, 44.92, 44.01, 43.1, 42.19, 41.28, 40.37, 39.47, 38.56, 37.65, 36.75, 35.85, 34.95, 34.06, 33.17, 32.28, 31.41, 30.54, 29.67, 28.82, 27.98, 27.14, 26.32, 25.5, 24.7, 23.9, 23.12, 22.34, 21.58, 20.83, 20.08, 19.35, 18.62, 17.89, 17.18, 16.47, 15.77, 15.07, 14.39, 13.71, 13.05, 12.4, 11.76, 11.14, 10.53, 9.94, 9.37, 8.82, 8.28, 7.76, 7.26, 6.79, 6.33, 5.89, 5.48, 5.08, 4.71, 4.37, 4.05, 3.75, 3.48, 3.23, 3.01, 2.81, 2.64, 2.49, 2.36, 2.24, 2.12, 2.01, 1.9, 1.8, 1.7, 1.6, 1.51, 1.42, 1.34, 1.26, 1.18, 1.1, 1.03, 0.96, 0.9, 0.84, 0.78, 0.72, 0.66, 0.61]
F: [80.96, 80.39, 79.42, 78.43, 77.45, 76.46, 75.47, 74.47, 73.48, 72.49, 71.5, 70.5, 69.51, 68.52, 67.53, 66.54, 65.55, 64.57, 63.59, 62.61, 61.63, 60.66, 59.69, 58.72, 57.75, 56.78, 55.82, 54.85, 53.89, 52.93, 51.97, 51.01, 50.06, 49.1, 48.15, 47.2, 46.25, 45.3, 44.36, 43.41, 42.47, 41.53, 40.59, 39.66, 38.73, 37.8, 36.88, 35.96, 35.04, 34.13, 33.23, 32.33, 31.44, 30.55, 29.68, 28.81, 27.94, 27.09, 26.24, 25.39, 24.56, 23.72, 22.9, 22.07, 21.26, 20.45, 19.65, 18.86, 18.07, 17.3, 16.54, 15.79, 15.05, 14.32, 13.61, 12.92, 12.23, 11.57, 10.92, 10.29, 9.68, 9.09, 8.52, 7.98, 7.45, 6.95, 6.47, 6.01, 5.57, 5.16, 4.78, 4.43, 4.11, 3.81, 3.55, 3.31, 3.09, 2.9, 2.73, 2.58, 2.42, 2.28, 2.14, 2.01, 1.88, 1.76, 1.65, 1.54, 1.44, 1.34, 1.24, 1.15, 1.06, 0.98, 0.91, 0.84, 0.78, 0.72, 0.66, 0.61]
Zasady punktacji
W tym wyzwaniu wygrywa zgłoszenie z najniższym wynikiem . Twój wynik będzie równy \$(1+L)\times(1 + M)\$, gdzie \$L\$to długość twojego kodu w bajtach i \$M\$to średni kwadratowy błąd szacunków, zaokrąglony do dwóch miejsc po przecinku. To jest program punktacji dla \$M\$.
Inne zasady
- Zabronione są standardowe luki.
- Wejście jest dość elastyczne. Możesz określić dwie różne wartości dla M / F:
'M'/'F',0/1. Jeśli naprawdę chcesz, możesz nawet wziąć jedną liczbę całkowitą ze znakiem reprezentującym M / F, ale pamiętaj, że0jest to dane wejściowe dla obu. Albo rzeczywiste i urojone części liczby zespolonej.- Nie musisz podejmować żadnych działań, jeśli nie chcesz, co powinno pozwolić ci na publikowanie odpowiedzi, które zawsze zwracają 4 lub cokolwiek innego.
- W przypadku pomyłki wynik nie może być losowy.
- Podaj sposób weryfikacji wyniku.
- Wbudowane programy, które mają taką dokładną tabelę śmiertelności, nie są zakazane, ale prosimy o wdrożenie własnego rozwiązania.
- Zachęcamy do wyjaśnień.
Dodatkowe bonusy:
Ponieważ R jest językiem miesiąca we wrześniu 2020 r. , Na koniec miesiąca przyznam nagrodę w wysokości 500 punktów za odpowiedź R z najlepszym wynikiem.
Odpowiedzi
JavaScript (ES6), wynik: 59,51 59,10
L = 52 bajty, M ≈ 0,1150638
Oczekuje (n)(m), gdzie m wynosi 1 dla mężczyzny lub 0 dla kobiety.
n=>m=>81-5*m-(.9+m/51+(70-27*m-(.92-m/7)*n)/2e4*n)*n
Wypróbuj online!
lub Pobierz surowe dane w formacie oczekiwanym przez program oceniający .
metoda
Jest to oparte na dwóch regresjach sześciennych, z kompromisem między rozmiarem kodu a dokładnością.
W przypadku kobiet oblicza się to:
$$f_0(x)=81-\frac{9}{10}x-\frac{7}{2000}x^2+\frac{23}{500000}x^3$$
A dla mężczyzn:
$$f_1(x)=76-\frac{469}{510}x-\frac{43}{20000}x^2+\frac{17}{437500}x^3$$
Jak dokładne to jest?
Poniżej znajduje się wykres błędów generowanych przez funkcję w zależności od wieku i płci.
R , wynik = 67,47 47,92
30 bajtów, MSE = 0,54587
-1 bajt (i -1,47 w wyniku) dzięki Dominicowi van Essenowi.
pnorm(scan(),31,41,F)*scan()-2
Wypróbuj online!
Format wejściowy to: wiek jako liczba całkowita, następnie nowa linia, potem płeć, a potem nowa linia. Seks jest zakodowany jako 98 dla mężczyzn i 106 dla kobiet.
Przybliża tabele aktuarialne funkcją przeżycia rozkładu normalnego (funkcja przeżycia wynosi 1 - funkcja dystrybucji kumulatywnych). Wypróbowałem kilka rodzin dystrybucji i normalnie zminimalizowałem MSE.
Niech \$\phi(x;\mu,\sigma)\$być gęstością a \$\mathcal N(\mu,\sigma^2)\$dystrybucja. Użyte przybliżenie to
\$f(x)=a+m\int_x^\infty\phi(t;\mu,\sigma)\,dt\$
Próbowałem użyć różnych wartości parametrów dla mężczyzn i kobiet, ale najlepszy wynik uzyskuje się, używając tych samych wartości \$a\$, \$\mu\$i \$\sigma\$i wybierając tylko różne wartości dla \$m\$. Od \$m=98\$dla mężczyzn i \$m=106\$ dla kobiet są wartościami optymalnymi, używam ich do bezpośredniego kodowania płci.
(Właściwie optymalnymi wartościami byłyby \$m=98.25528\$dla mężczyzn i \$m=106.34315\$dla kobiet, ale używanie takich wartości do definiowania płci naprawdę wydaje się być oszustwem. Dałoby to 47,49 punktów, co oznacza niewielką poprawę).
Fabuła przybliżenia dla mężczyzn:
Fabuła przybliżenia dla kobiet:
Język Wolfram (Mathematica) , wynik 151,8,
32 bajty, 3,6 MSE
#-Cos[x(Pi-.02)/238]~Sum~{x,#2}&
Wypróbuj online!
Zauważyłem, że różnice wartości były podobne do Cos(x) [0,pi/2]
So, skumulowany Cos (x) działa całkiem nieźle na mężczyzn ...
MĘSKIE
MSE 0,90
KOBIETA
MSE 6,29
( chyba Cos (x) lepiej rozumie mężczyzn ... )
Specjalne podziękowania dla @atta za skrócenie mojego kodu do 33 bajtów
Rubin , wynik 56,12 ... 43,94 43,92
\$L=35\$, \$M\approx0.220060\$
->x,f{f.*1.87e6-(21676+(66-x)*x)*x}
Wypróbuj online!
Dane wejściowe to wiek \$x\$i pływak \$f\$, który jest 4.027e-5dla mężczyzn i 4.362e-5kobiet. (Zobacz poniżej alternatywną wersję, która wymaga \$f\$zamiast tego jako liczbę całkowitą). Podejście polega na dopasowaniu wielomianu sześciennego do średniej długości życia uśrednionej dla obu płci, a następnie przeskalowaniu tego wielomianu za pomocą czynnika płci, aby uzyskać przybliżenia specyficzne dla płci. Wielomian wybrany dla średniej długości życia to$$ \frac{x^3-66x^2-21676x+1870000}{23840} $$ a czynnik płci to $$ \begin{cases}0.96,\;\text{male}\\1.04,\;\text{female}.\end{cases} $$Innymi słowy, oczekiwana długość życia mężczyzny wynosi około \$0.96\$razy więcej niż przeciętny człowiek (mężczyzna lub kobieta). Podobnie oczekiwana długość życia kobiety wynosi około \$1.04\$ razy więcej niż przeciętny człowiek.
Poniższy wykres przedstawia kwadrat błędu jako funkcję wieku dla każdej płci. Przerywana szara linia przedstawia średni kwadrat błędu dla obu płci.
Jednym z interesujących punktów w kodzie jest jawne wywołanie *metody float f. Wszystko na prawo od f.*jest interpretowane jako argument metody, więc wielomian nie musi być ujęty w nawiasy .
Ruby , wynik 50.06
\$L=40\$, \$M\approx0.220981\$
->x,f{f/9e3*(56541-(656+(2-x/33r)*x)*x)}
Wypróbuj online!
Pomimo przestrzegania zasad, biorąc \$f\$jako pływak (jak powyżej) wydaje się więcej niż trochę „oszukany”. W tej wersji zastosowano to samo podejście ogólne, ale tutaj \$f\$jest liczbą całkowitą: \$12\$dla mężczyzn i \$13\$dla kobiet. Wielomian używany do średniej oczekiwanej długości życia to$$ \frac{x^3/33-2x^2-656x+56541}{720}. $$
J , wynik 53,76 52,78
L = 46, M = 0.122983
Przyjmuje M / K jako 1/0 po prawej stronie i wiek po lewej stronie. Proste przybliżenie wielomianu trzeciego stopnia. Wielomiany J czyta się od lewej do prawej, czyli 81 - 0.9x - 347e-5x² + 455e-7x³dla przypadku 1. Przypadek 0 tylko trochę modyfikuje liczby do 76 - 0.92x - 207e-5x² + 385e-7x³. p.oblicza wielomian w x, w tym przypadku wieku.
p.~81 _0.9 _347e_5 455e_7-5 0.02 _14e_4 7e_6&*
Wypróbuj online!
Python 3 , wynik 94,40, 58 bajtów, 0,60 MSE
Tylko proste przybliżenia liniowe. Truedla kobiet i Falsedla mężczyzn .
lambda a,g:[75+5*g-(.89+g/30)*a,12-a/11][a>81]+(70<a<90)*2
Wypróbuj online!
Wizualne przedstawienie przybliżenia:
R , wynik 46,00036
Przesuwanie granic `` dowolnych dwóch różnych wartości '' jako danych wejściowych bardziej niż trochę ...
45 bajtów, błąd średniokwadratowy 7,9e-6
function(a,s)s%/%gmp::as.bigz(1e4)^a%%1e4/100
Wypróbuj online!
Dane wejściowe to liczba całkowita a, taka jak wiek i jedna z dwóch „dużych liczb całkowitych” sokreślających płeć M / K.
Wynik to „duża racjonalna” liczba.
Jak (prawdopodobnie) zachęcają do tego hojnie elastyczne zasady wprowadzania danych, wartości określające płeć są integralne dla obliczeń (chociaż w tym przypadku prawdopodobnie bardziej niż zamierzano ...).
Każda z dużych liczb całkowitych M, F jest konstruowana jako 1 ... 120-ta potęga 1e4 pomnożona przez 100-krotność oczekiwanej długości życia w każdym wieku: zasadniczo jest to podstawa kodowania 10000. life_expectancyFunkcja po prostu dekoduje ath base-10000 cyfrę i dzieli się przez 100.
Mimo że funkcja korzysta z gmpbiblioteki o dowolnej precyzji do obliczeń, niewielka liczba zdekodowanych wartości nadal zawiera niedokładności na drugim miejscu po przecinku z powodów, których nie rozumiem.
Niemniej jednak średni kwadrat błędu jest (zgodnie z oczekiwaniami) na tyle bliski zeru, że nie ma to znaczenia, ponieważ i tak musimy dodać do niego 1, aby uzyskać wynik.
R , wynik 75,74445
61 bajtów, błąd średniokwadratowy 0,222
function(a,s)s*predict(loess(c(82,58,35,14,3,1)~c(0:5*24)),a)
Wypróbuj online!
Używa wygładzania lessowego do interpolacji między zakodowanymi na stałe punktami danych.
Krzywe M i F są niezwykle podobne do siebie po przeskalowaniu (o 0,92x) - patrz czarne i szare punkty na wykresie - więc zakodowane punkty są pobierane ze średniej z dwóch (przeskalowanych) krzywych, a następnie zaokrąglone do ładnych, krótkich wartości. Czerwona linia na wykresie przedstawia interpolowane wartości.
Niestety (dla mnie) system punktacji polegający na dodaniu 1 do błędu średniokwadratowego silnie nagradza rozsądnie-bliskie dopasowania, ale nie daje dużo większej nagrody za bardzo -ścisłe dopasowanie, więc dodatkowa długość kodu tutaj oznacza, że ogólny wynik jest nadal gorszy niż luźniejsze dopasowanie Robina Rydera do rozkładu normalnego.
Język Wolfram (Mathematica) , wynik 34,16
27 bajtów, średni błąd kwadratowy 0,21676 (zaokrąglony do 0,22)
#3(#2-#+Sqrt[(#2-#)^2+#4])&
Wypróbuj online!
Nienazwana funkcja (którą nazwiemy fna potrzeby dyskusji), która przyjmuje dwa argumenty (w tej kolejności), wiek (liczbę całkowitą od 0 do 119) oraz wskaźniki dla kobiet lub mężczyzn w następującej formie:
- wskaźnik dla "kobiet":
Sequence[83.506,0.4794,222.8] - wskaźnik dla "mężczyzn":
Sequence[80.596,0.4636,248.5]
W Mathematica f[a,Sequence[b,c,d]]jest tym samym, co f[a,b,c,d]; więc Sequence[b,c,d]jest to prawie dokładnie uporządkowana trójka, z wyjątkiem tego, że jest lepsza do podłączenia do funkcji.
Powyższy kod implementuje funkcję matematyczną
\$ f(a,b,c,d) = c\big( b-a + \sqrt{(b-a)^2+d} \big), \$
gdzie \$a\$to wiek i \$b,c,d\$ to parametry numeryczne używane do optymalizacji dopasowania do danych.
Ta specyficzna forma była motywowana moim spostrzeżeniem, że wykresy danych dla każdej płci wyglądały jak hiperbola z asymptotą skośną w lewo i asymptotą poziomą w prawo, co można sprowadzić do powyższej formy parametrycznej (tutaj \$(b,0)\$są współrzędnymi środka hiperboli, \$2c\$jest nachyleniem asymptoty skośnej, a \$d\$kontroluje, jak daleko od środka wygina się hiperbola). Następnie wykorzystano algorytm ewolucyjny do precyzyjnego dostrojenia parametrów dla każdej płci oddzielnie; eksperymenty sugerują, że istnieje jedno lokalne minimum dla każdego zestawu danych, ponieważ wszystkie próby prowadziły do bardzo podobnych wartości dla \$b,c,d\$.
(Technicznie rzecz biorąc, cała funkcja mogła zostać użyta jako wskaźnik płci, co doprowadziło do 4-bajtowego rozwiązania #2@#z wynikiem 6,1 . Jednak wiele zgłoszeń mogło zrobić podobne rzeczy).