7 mins read

Apakah bola basket adalah jalan acak? – Beragampengetahuan

Oleh: Julia di HasItHalted

Diposting ulang dari:

Sekitar dua tahun yang lalu, saya menghadiri seminar yang diberikan oleh Dr. Sid Redner dari Santa Fe Institute bertajuk “Apakah Mencetak Skor dalam Bola Basket Merupakan Gerakan Acak?” Saya tentu saja meragukan bahwa permainan seru seperti itu memiliki kemiripan dengan melempar koin, namun Dr. Redner terus meyakinkan saya – dan tidak diragukan lagi, banyak pemirsa lainnya – bahwa ekspresi perilaku bola basket yang sebenarnya menyerupai jalan acak.

Di akhir ceramahnya, Dr. Redner mengatakan sesuatu seperti “aplikasi taruhan jelas dibiarkan sebagai latihan untuk penonton.” Maka sebagai penonton yang antusias marilah kita mencoba menyelesaikan latihan ini.

Catatan: semua kode dan data untuk proyek ini dapat ditemukan di repositori github [2]

Contents

Pahami modelnya

Saya sangat menyarankan Anda membaca artikel tersebut [1] bahwa Dr. Redner dkk. al. diterbitkan untuk pemahaman yang lengkap. Namun, berikut adalah poin-poin utama yang kita perlukan:

Anggapan

  1. Definisi jalan acak: Skor sebenarnya, $\\Delta_n\_n \in \mathbbN$ (selisih antara skor tim A dan B) dapat dimodelkan sebagai jalan acak anti-kontinu. Artinya jika skor naik dalam satu permainan, kemungkinan besar permainan berikutnya akan menurun.
    $$\Delta_n = \jumlah_i=1^n \delta_i$$
    $$\mulai kasus
    \delta_i > 0 & \teks dengan probabilitas p_i \\
    \delta_i
  2. Meluncur dan menggiling: Kemungkinan sebuah tim mencetak poin berbanding lurus dengan seberapa jauh mereka tertinggal:
    $$p_n = (\textcolororange\teksistilah lain) – .152 r_n-1 – .0022 \Delta_n-1, \quad \forall \; n \dalam \mathbbN$$
    Di sini, $r_n-1 = \kiri(\frac\delta_n-1\kanan)$. Hal ini dijelaskan dalam artikel sebagai “tim yang menang akan menyerah dan tim yang kalah akan menderita”.
  3. Kekuatan tim: Kekuatan sebuah tim juga mempengaruhi kemampuannya dalam mencetak gol:
    $$p(I_A, r_n-1, \Delta_n-1) = I_A – 0,152r_n-1 – 0,0022 \Delta_n-1, \quad \untuk semua \; n \dalam \mathbbN$$
    Dimana kekuatan sebuah tim ditentukan oleh parameter $X_A$ dan $X_B$ sebagai $I_A(X_A, X_B) = \fracX_AX_A + X_B$. Selain itu, $X_A$ dan $X_B$ didistribusikan menurut $\mathcalN(\mu = 1,\sigma^2=.0083).$
  4. Waktu antar pertandingan: Waktu antara setiap permainan didistribusikan secara eksponensial
    $$\tau_n \sim \textExp(\lambda)$$
  5. Kemungkinan mencetak gol: Untuk setiap permainan, kemungkinan mencetak $n$ poin adalah
    $$\mulai kasus
    \mulai
    \delta = 1, \kuad & 8,7\% \\
    \delta = 2, \kuad &73,86\% \\
    \delta = 3, \kuad & 17,82\% \\
    \delta = 4, \kuad & 0,14\% \\
    \delta = 5, \kuad & 0,023\% \\
    \delta = 6, \kuad & 0,0012\% \\
    \endalign
    \akhir$$
    ⚠️ Satu-satunya keluhan saya terhadap artikel ini adalah bahwa “probabilitas” di atas tidak berjumlah 1 jadi saya tidak yakin bagaimana menafsirkannya. Saya melanjutkan dan menghilangkan $\delta=6$ dan menurunkan probabilitas $\delta=5$ sehingga probabilitas berjumlah 1. Ini seharusnya baik-baik saja karena permainan 5 dan 6 poin jarang terjadi sehingga tidak akan mempengaruhi modelnya terlalu banyak.

Membangun simulasi

Kumpulkan data simulasi

Dua hal yang ingin saya tingkatkan adalah memperluas kumpulan data dan menggunakan pembaruan bayesian untuk memperkirakan $\lambda$ dan $I_A$ untuk sebuah game dengan lebih akurat.

Untuk kumpulan data, Dr. Redner hanya menggunakan permainan dari tahun 2006-2009, tetapi saya mendapatkan semua babak playoff setelah tahun 2000. Dengan menggunakan kumpulan data ini, saya melihat Distribusi jumlah rata-rata permainan per 30 detik

Distribusi untuk nilai $\lambda$. Kurva standar oranye memiliki rata-rata 1,005 dan std 0,1. Saya tidak yakin mengapa ada defisit yang begitu besar pada 1 permainan per 30 detik; tampaknya setengah dari tingkat normal.

Distribusi untuk nilai $\lambda$. Kurva standar oranye memiliki rata-rata 1,005 dan std 0,1. Saya tidak yakin mengapa ada defisit yang begitu besar pada 1 permainan per 30 detik; tampaknya setengah dari tingkat normal.

memberi kita nilai sebelumnya untuk $\lambda$ yang dapat kita perbarui secara langsung agar lebih sesuai dengan model kita untuk game tertentu (dan kita sudah memiliki nilai sebelumnya untuk $X$ ):

$$\lambda \sim \mathcalN(1.005,0.1)$$
$$X \sim \mathcalN(1, \sqrt0.0083)$$

Pembaruan Bayesian

Dengan menggunakan pembaruan bayesian sederhana, kita dapat secara akurat memperkirakan kemungkinan $\lambda$ atau $I_A$ data permainan tertentu pada tingkat penilaian $\t_1,\ldots ,t_n\$ dan siapa yang mencetak gol dalam setiap permainan $ \r_1,\ldots ,r_n\$:

$$\mulai penyelarasan
f(\lambda | \t_1,\ldots,t_n\) &\propto f(\t_1,\ldots,t_n\ | \lambda) f(\lambda) \\
&\propto \kiri(\prod_i=1^nf(t_i | \lambda) \kanan) f(\lambda) \\
&\propto \kiri(\prod_i=1^n \lambda e^-\lambda t_i \kanan) \mathcalN(1.005,0.1) \\
&\propto \kiri(\lambda^ne^-\lambda \sum_i=1^n t_i \kanan) \mathcalN(1.005,0.1) \\ \\
f(X_A, X_B | \r_1,\ldots,r_n\) &\propto f(\r_1,\ldots,r_n\ |
&\propto \kiri(\prod_i=1^nf(r_i | X_A,X_B) \kanan) f(X_A,X_B) \\
&\propto \kiri|\prod_i=1^np\kiri(\fracX_AX_A + X_B, r_i-1, \Delta_i-1 \kanan) – \frac1-r_i2 \kanan| \cdot \mathcalN(1, \sqrt0.0083)(X_A) \cdot \mathcalN(1, \sqrt0.0083)(X_B)\
\endalign
$$

Seperti yang Anda lihat, memperbarui nilai $X$ sedikit lebih rumit tetapi masih cukup mudah untuk dihitung. Kode untuk melakukan ini ditunjukkan di bawah ini:

function update_rate!(params, time_deltas)
    time_deltas = time_deltas/30
    params.rate = (x) -> x^length(time_deltas) * exp(-x * sum(time_deltas)) * pdf(defaultRate, x) / params.rate_Z
    normalize_rate!(params)
end

function update_strengths!(params, scoring_data, lookback=15)
    lookback = min(lookback, length(scoring_data))
    scoring_data = scoring_data[end-lookback+1:end]

    score_probs = (x,y) -> prod(map((z) -> score_prob(z, x, y), scoring_data))
    params.strengths = (x,y) -> score_probs(x,y) * pdf(defaultStrengths, x) * pdf(defaultStrengths, y) / params.strengths_Z
    normalize_strengths!(params)
end

Namun, rintangan sebenarnya adalah mengambil sampel nilai $\lambda$ dan $X$ dari file pdf.

Pengambilan sampel parameter permainan

Karena kita memiliki akses ke file pdf (bahkan konstanta normalisasinya cukup mudah dihitung menggunakan metode numerik), kita dapat menggunakan pengambilan sampel penting sebagai metode brute force. Saya yakin algoritma MCMC yang lebih kompleks dapat digunakan, tetapi distribusi nilai $X$ yang tidak bersahabat membuat saya sulit menggunakan perpustakaan eksternal seperti Turing.jl.

Bagaimanapun, bagi pembaca yang tertarik, alasan kita dapat menggunakan sampling penting untuk menghitung nilai yang diharapkan dari fungsi $g$ untuk pdf $f$ menggunakan pdf $h $ lainnya adalah karena hal berikut:

$$\mulai penyelarasan
\undersetX \sim f\mathbbE[g(X)] &= \int g(x) f(x) dx \\
&= \int g(x) \fracf(x)h(x) h(x) dx \\
&= \undersetX \sim h\mathbbE\kiri[\fracf(X)h(X) g(X)\right]
\endalign$$

Ini juga memberitahu kita bahwa $h$ bersyarat bahwa ia bukan nol di mana pun $f$ bukan nol. Saat bekerja dengan perhitungan empiris, istilah $\fracf(x)h( x)$ disebut bobot sampel untuk alasan yang jelas.

Jadi, menurut perkiraan empiris kami, pilihan yang baik untuk $h$ adalah distribusi sebelumnya. Cuplikan kode berikut menunjukkan implementasi fungsi sampling:

function sample_params(game, n)
    r = rand(defaultRate, n)
    wr = game.params.rate.(r) ./ pdf(defaultRate, r)

    s = rand(defaultStrengths, n, 2)
    ws = game.params.strengths.(s[:,1], s[:,2]) ./ (pdf(defaultStrengths, s[:,1]) .* pdf(defaultStrengths, s[:,2]))
    w = wr .* ws

    return r, s, w
end

function sample_games(game, n=1000, k=1000)
    results = zeros(n)
    for i in 1:n
        r, s, w = sample_params(game, k)
        sample_results = zeros(k)
        Threads.@threads for j in 1:k
            X = s[j, 1]
            Y = s[j, 2]
            sample_results[j] = simulate_game(game, r[j], X, Y) * w[j]
        end
        results[i] = sum(sample_results) / k
    end
    return sum(results)/n
end

Permainan simulasi

Langkah terakhir adalah melakukan simulasi permainan. Ini cukup mudah dilakukan jika kita dapat memasukkan semua parameter yang kita perlukan.

function simulate_game(game, lambda, Xa, Xb)
    if length(game.plays) == 0
        t = 0
        s = 0
        r = 0
    else
        t = game.plays[end][1]
        s = net_score(game)
        r = sign(game.plays[end][2])
    end

    while t < 2880
        t += rand(Exponential(1/lambda)) * 30
        if rand() < score_prob((1, r, s), Xa, Xb)
            s += random_play()
            r = 1
        else
            s -= random_play()
            r = -1
        end
    end

    return (sign(s)+1)/2
end

Hasil

Pengamatan model

Cuplikan kode di atas memungkinkan saya untuk melihat beberapa contoh permainan dan memberi saya kesimpulan berikut tentang cara kerja gerakan acak baksetball:

  1. Kekuatan non-dominan: Dr Redner menyebutkan bahwa akan sulit untuk secara akurat memprediksi kekuatan tim berdasarkan data pertandingan, dan karena pembaruan Bayesian sebagian besar tetap tidak berubah sebelumnya, saya harus setuju
  2. Permainannya relatif homogen: Meskipun distribusi $\lambda$ sudah secara visual menunjukkan pembaruan yang signifikan sepanjang game, probabilitas yang dihasilkan sebagian besar tetap tidak berubah–artinya kita tidak akan dapat membedakan sebagian besar game.
  3. Hukum Arcsin: Faktor terbesar yang menentukan siapa yang menang adalah tim yang sedang memimpin. Hal ini sesuai dengan hukum arcsinus yang menyatakan bahwa jalan acak kemungkinan besar akan menghabiskan waktu pada salah satu sisi titik asal.

Aplikasi

Karena sifat kode yang efisien (terima kasih Julia!), masuk akal untuk membangun situs menggunakan versi model yang lebih sederhana (tanpa pembaruan bayesian karena hampir tidak membuat perbedaan dan pengguna harus berusaha keras untuk memasuki setiap permainan). Dengan cara ini, seseorang yang bertaruh pada suatu permainan dapat membuat keputusan berdasarkan matematika tentang cara membelanjakan uangnya!

Situs web ini mengambil poin tim dan waktu yang berlalu untuk menghitung tingkat kemenangan tim (semakin rendah semakin baik).

Situs web ini mengambil poin tim dan waktu yang berlalu untuk menghitung tingkat kemenangan tim (semakin rendah semakin baik).

Aplikasi menghitung persentase kemenangan suatu tim. Dengan kata lain, ini memberikan peluang kebalikan dari sebuah tim untuk menang, jadi semakin mendekati 1, semakin besar kemungkinan tim tersebut untuk menang, dan sebaliknya.

Jika bandar taruhan menawarkan koefisien pembayaran yang lebih tinggi dari odds yang dihitung maka mungkin ada baiknya membelinya karena kami memperkirakan bahwa tim tersebut lebih berpeluang menang daripada yang diperkirakan oleh bandar taruhan (oleh karena itu, bandar taruhan telah melebih-lebihkan jumlah pembayaran yang tinggi).

Saya sendiri tidak dapat menghosting aplikasinya, tetapi Anda dapat menemukan kodenya – beserta instruksi untuk menjalankannya – di repositori github [2].

Referensi

  1. Gabel, A., Redner, S., “Gambar Jalan Acak Penilaian Bola Basket,” arXiv:1109.2825v1 (2011).
  2. Vattikuti, V., “Peluang NBA,” github.com/hasithv/nba-odds (2024).

Software Terbaru Saat Ini



Aplikasi yang sedang trend saat ini

object oriented programming, programming language, programming adalah, web programming, belajar programming, tournament software, software, software adalah, contoh software, apa itu software, pengertian software, aplikasi, aplikasi penghasil uang, aplikasi bokep, aplikasi video, programming

#Apakah #bola #basket #adalah #jalan #acak

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *