Korelasi antara dua Deck kartu?

11

Saya telah menulis sebuah program untuk mensimulasikan kartu shuffle overhand .

Setiap kartu diberi nomor, dengan setelan naik dari CLUBS, DIAMONDS, HEARTS, SPADESdan peringkat dari Dua hingga Sepuluh kemudian Jack, Ratu, Raja dan Ace. Jadi Dua Klub memiliki Jumlah 1, Tiga Klub a 2. .... Ace of Clubs adalah 13 ... Ace of Spades adalah 52.

Salah satu metode untuk menentukan seberapa banyak kartu dikocok adalah membandingkannya dengan kartu yang tidak diacak dan melihat apakah urutan kartu berkorelasi.

Artinya, saya mungkin memiliki kartu-kartu ini, dengan kartu yang tidak diacak untuk perbandingan:

Unshuffled          Shuffled            Unshuffled number   Shuffled number
Two of Clubs        Three of Clubs      1                   2
Three of Clubs      Two of Clubs        2                   1
Four of Clubs       Five of Clubs       3                   4
Five of Clubs       Four of Clubs       4                   3

Korelasi dengan metode Pearson adalah: 0,6

Dengan satu set kartu yang besar (semuanya 52) Anda mungkin melihat pola-pola muncul. Hipotesis saya adalah bahwa setelah lebih banyak mengocok Anda akan mendapatkan lebih sedikit korelasi.

Namun, ada banyak cara untuk mengukur korelasi.

Saya sudah mencoba tangan saya di korelasi Pearson tetapi saya tidak yakin apakah ini adalah korelasi yang tepat untuk digunakan dalam situasi ini.

Apakah ini ukuran korelasi yang cocok? Apakah ada ukuran yang lebih cocok?

Poin Bonus Saya terkadang melihat data seperti ini di hasil saya:

Contoh Kartu Korelasi

Jelas ada beberapa korelasi tetapi saya tidak tahu bagaimana Anda mengukur 'trendline' yang terpisah?

Pureferret
sumber
Untuk membantu kami lebih memahami apa yang Anda inginkan, mungkin Anda bisa sedikit lebih tepat tentang apa yang Anda maksud dengan "urutan kartu yang berkorelasi."
whuber
@whuber, saya pikir OP berarti posisi kartu yang diberikan sebelum menyeret & setelah. Misalnya, kartu as hati mungkin 3 dari atas sebelumnya & 8 sesudahnya.
gung - Reinstate Monica
Saya ingin tahu apakah dengan "overhand shuffle", maksud Anda apa yang disebut Wikipedia sebagai "riffle shuffle"?
gung - Reinstate Monica
1
@ masukkan halaman wikipedia yang Anda tautkan memiliki entri untuk "riffle shuffle" dan "overhand shuffle" yang dibicarakan OP. Baik untuk membaca tautan yang Anda tautkan ke :)
bdeonovic
1
@ Pureferret Dalam hal ini, saya akan menguraikan kembali. Anda harus menghitung ukuran korelasi peringkat.
tchakravarty

Jawaban:

14

Anda dapat mengukur tingkat korelasi relatif (atau lebih tepatnya, tingkat peningkatan keacakan) dengan menggunakan entropi Shannon dari perbedaan nilai nominal antara semua pasangan kartu yang berdekatan.

Berikut ini cara menghitungnya, untuk setumpuk kartu acak sebanyak 52 kartu. Anda mulai dengan mengulang sekali melalui seluruh dek, dan membangun semacam histogram. Untuk setiap posisi kartu , hitung selisih nilai nominal . Untuk membuat ini lebih konkret, katakanlah kartu di posisi adalah raja sekop, dan kartu di posisi ke- adalah empat klub. Kemudian kita memiliki dan dan . Ketika Anda sampai ke , itu adalah kasus khusus; Anda berputar kembali ke awal dek dan mengambili=1,2,...,52ΔFi=Fi+1Fi(i+1)iFi+1=51Fi=3ΔFi=513=48i=52ΔF52=F1F52. Jika Anda berakhir dengan angka negatif untuk salah satu , tambahkan 52 untuk membawa perbedaan nilai nominal kembali ke kisaran 1-52.ΔF

Anda akan berakhir dengan satu set perbedaan nilai nominal untuk 52 pasang kartu yang berdekatan, masing-masing jatuh ke kisaran yang diizinkan dari 1-52; hitung frekuensi relatif dari ini menggunakan histogram (yaitu, array satu dimensi) dengan 52 elemen. Histogram merekam semacam "distribusi probabilitas yang diamati" untuk dek; Anda dapat menormalkan distribusi ini dengan membagi jumlah dalam setiap nampan dengan 52. Dengan demikian Anda akan berakhir dengan serangkaian variabel mana masing-masing dapat mengambil diskrit rentang nilai yang mungkin: {0, 1/52, 2/52, 3/52, dll} tergantung pada berapa banyak perbedaan nilai wajah berpasangan yang berakhir secara acak di tempat sampah tertentu dari histogram.p1,p2,...p52

Setelah memiliki histogram, Anda dapat menghitung entropi Shannon untuk iterasi acak acak sebagai

E=k=152pkln(pk)
Saya telah menulis simulasi kecil di R untuk menunjukkan hasilnya. Plot pertama menunjukkan bagaimana entropi berevolusi selama 20 iterasi acak. Nilai 0 dikaitkan dengan dek yang dipesan dengan sempurna; nilai yang lebih besar menandakan dek yang semakin tidak teratur atau terkait dekorasi. Plot kedua menunjukkan serangkaian 20 aspek, masing-masing berisi plot yang mirip dengan yang awalnya disertakan dengan pertanyaan, menunjukkan pesanan kartu yang diacak vs pesanan kartu awal. 20 aspek dalam plot kedua sama dengan 20 iterasi pada plot pertama, dan mereka juga diberi kode warna yang sama, sehingga Anda bisa mendapatkan nuansa visual untuk tingkat entropi Shannon yang sesuai dengan seberapa banyak keacakan dalam urutan semacam itu. Kode simulasi yang menghasilkan plot ditambahkan di bagian akhir.

Entropi informasi Shannon vs. iterasi acak

Urutan acak vs urutan awal untuk 20 iterasi pengocokan, menunjukkan kartu menjadi semakin sedikit berkorelasi dan didistribusikan secara acak dari waktu ke waktu.

library(ggplot2)

# Number of cards
ncard <- 52 
# Number of shuffles to plot
nshuffle <- 20
# Parameter between 0 and 1 to control randomness of the shuffle
# Setting this closer to 1 makes the initial correlations fade away
# more slowly, setting it closer to 0 makes them fade away faster
mixprob <- 0.985 
# Make data frame to keep track of progress
shuffleorder <- NULL
startorder <- NULL
iteration <- NULL
shuffletracker <- data.frame(shuffleorder, startorder, iteration)

# Initialize cards in sequential order
startorder <- seq(1,ncard)
shuffleorder <- startorder

entropy <- rep(0, nshuffle)
# Loop over each new shuffle
for (ii in 1:nshuffle) {
    # Append previous results to data frame
    iteration <- rep(ii, ncard)
    shuffletracker <- rbind(shuffletracker, data.frame(shuffleorder,
                            startorder, iteration))
    # Calculate pairwise value difference histogram
    freq <- rep(0, ncard)
    for (ij in 1:ncard) {
        if (ij == 1) {
            idx <- shuffleorder[1] - shuffleorder[ncard]
        } else {
            idx <- shuffleorder[ij] - shuffleorder[ij-1]
        }
        # Impose periodic boundary condition
        if (idx < 1) {
            idx <- idx + ncard
        }
        freq[idx] <- freq[idx] + 1
    }
    # Sum over frequency histogram to compute entropy
    for (ij in 1:ncard) {
        if (freq[ij] == 0) {
            x <- 0
        } else {
            p <- freq[ij] / ncard
            x <- -p * log(p, base=exp(1))
        }
        entropy[ii] <- entropy[ii] + x
    }
    # Shuffle the cards to prepare for the next iteration
    lefthand <- shuffleorder[floor((ncard/2)+1):ncard]
    righthand <- shuffleorder[1:floor(ncard/2)]
    ij <- 0
    ik <- 0
    while ((ij+ik) < ncard) {
        if ((runif(1) < mixprob) & (ij < length(lefthand))) {
            ij <- ij + 1
            shuffleorder[ij+ik] <- lefthand[ij]
        }
        if ((runif(1) < mixprob) & (ik < length(righthand))) {
            ik <- ik + 1
            shuffleorder[ij+ik] <- righthand[ik]
        }
    }
}
# Plot entropy vs. shuffle iteration
iteration <- seq(1, nshuffle)
output <- data.frame(iteration, entropy)
print(qplot(iteration, entropy, data=output, xlab="Shuffle Iteration", 
            ylab="Information Entropy", geom=c("point", "line"),
            color=iteration) + scale_color_gradient(low="#ffb000",
            high="red"))

# Plot gradually de-correlating sort order
dev.new()
print(qplot(startorder, shuffleorder, data=shuffletracker, color=iteration,
            xlab="Start Order", ylab="Shuffle Order") + facet_wrap(~ iteration,
            ncol=4) + scale_color_gradient(low="#ffb000", high="red"))
stachyra
sumber
2

Saya tahu bahwa posting ini sudah hampir 4 tahun, tetapi saya seorang cryptanalyst yang hobi, dan telah belajar bermain kartu sandi . Akibatnya, saya kembali ke pos ini berulang kali untuk menjelaskan pengocokan geladak sebagai sumber entropi untuk secara acak memasukkan geladak. Akhirnya, saya memutuskan untuk memverifikasi jawabannya dengan stachyra dengan mengocok deck dengan tangan, dan memperkirakan entropi deck setelah setiap pengocokan.

TL; DR, untuk memaksimalkan entropi dek:

  • Untuk hanya mengacak-acak riffle, Anda perlu 11-12 shuffles.
  • Untuk memotong dek terlebih dahulu kemudian mengacak-acak, Anda hanya perlu 6-7 potong-dan-mengocok.

Pertama, semua yang disebutkan oleh stachyra untuk menghitung entropi Shannon adalah benar. Ini bisa direbus dengan cara ini:

  1. Secara numerik memberikan nilai unik untuk masing-masing 52 kartu di geladak.
  2. Kocok dek.
  3. Untuk n = 0 hingga n = 51, catat setiap nilai (n - (n + 1) mod 52) mod 52
  4. Hitung jumlah kemunculan 0, 1, 2, ..., 49, 50, 51
  5. Normalisasi catatan itu dengan membagi masing-masing dengan 52
  6. Untuk i = 1 hingga i = 52, hitung -p_i * log (p_i) / log (2)
  7. Jumlahkan nilainya

Di mana stachyra membuat satu asumsi halus, adalah bahwa menerapkan shuffle manusia dalam program komputer akan datang dengan beberapa barang bawaan. Dengan kartu remi berbasis kertas, begitu digunakan, minyak dari tangan Anda berpindah ke kartu. Dalam jangka waktu yang lama, karena penumpukan minyak, kartu akan mulai saling menempel, dan ini akan berakhir dengan shuffle Anda. Semakin banyak dek yang digunakan, semakin besar kemungkinan dua atau lebih kartu yang berdekatan akan saling menempel, dan semakin sering hal itu terjadi.

Lebih lanjut, seharusnya kedua klub dan jack of heart tetap bersatu. Mereka mungkin akan terjebak bersama selama pengocokan Anda, tidak pernah berpisah. Ini bisa ditiru dalam program komputer, tetapi ini tidak terjadi dengan rutin R stachyra.

Juga, stachyra memiliki variabel manipulasi "mixprob". Tanpa sepenuhnya memahami variabel ini, itu adalah sedikit kotak hitam. Anda bisa salah mengaturnya, memengaruhi hasil. Jadi, saya ingin memastikan intuisinya benar. Jadi saya memverifikasi dengan tangan.

Saya mengocok deck 20 kali dengan tangan, dalam dua contoh berbeda (40 total pengocokan). Pada contoh pertama, saya hanya mengacak-acak, menjaga agar potongan kanan dan kiri tetap sama. Dalam contoh kedua, saya memotong geladak dengan sengaja dari tengah geladak (1/3, 2/5, 1/4, dll.) Sebelum melakukan pemotongan genap untuk pengocokan riffle. Perasaan saya pada contoh kedua adalah bahwa dengan memotong geladak sebelum mengocok, dan menjauh dari tengah, saya bisa memasukkan difusi ke dalam geladak lebih cepat daripada mengacak-acak stock riffle.

Inilah hasilnya. Pertama, pengocokan riffle lurus:

Entropi per kartu dengan pengocokan riffle

Dan di sini memotong dek dikombinasikan dengan pengocokan riffle:

Entropi per kartu dengan cutting dan shuffling riffle

Tampaknya entropi dimaksimalkan sekitar 1/2 waktu klaim oleh stachyra. Lebih lanjut, intuisi saya benar bahwa memotong geladak dengan sengaja menjauh dari tengah terlebih dahulu, sebelum mengacak-acakkan riffle benar-benar memperkenalkan difusi ke dalam geladak. Namun, setelah sekitar 5 mengocok, itu tidak terlalu penting lagi. Anda dapat melihat bahwa setelah sekitar 6-7 mengocok, entropi dimaksimalkan, dibandingkan 10-12 ketika klaim membuat stachyra saya. Mungkinkah 7 mengocok cukup, atau saya dibutakan?

Anda dapat melihat data saya di Google Sheets . Mungkin saja saya salah mencatat satu atau dua kartu remi, jadi saya tidak bisa menjamin akurasi 100% dengan data.

Penting bahwa temuan Anda juga diverifikasi secara independen. Brad Mann, dari Departemen Matematika di Universitas Harvard, mempelajari berapa kali yang diperlukan untuk mengocok setumpuk kartu sebelum dapat diprediksi kartu apa pun di geladak benar-benar tidak dapat diprediksi (entropi Shannon dimaksimalkan). Hasilnya dapat ditemukan di PDF 33 halaman ini .

Yang menarik dengan temuannya, adalah bahwa dia sebenarnya secara mandiri memverifikasi artikel New York Times 1990 oleh Persi Diaconis , yang mengklaim bahwa 7 shuffle cukup untuk mencampur setumpuk kartu remi secara menyeluruh melalui shuffle riffle.

Brad Mann berjalan melalui beberapa model matematika yang berbeda dalam pengocokan, termasuk rantai Markov, dan sampai pada kesimpulan berikut:

Ini adalah sekitar 11,7 untuk n = 52, yang berarti bahwa, menurut sudut pandang ini, kami mengharapkan rata-rata 11 atau 12 pengocokan diperlukan untuk mengacak setumpuk kartu yang sebenarnya. Perhatikan bahwa ini jauh lebih besar dari 7.

Brad Mann hanya memverifikasi hasil stachyra secara independen, dan bukan milikku. Jadi, saya melihat lebih dekat pada data saya, dan saya menemukan mengapa 7 shuffle tidak cukup. Pertama, entropi Shannon maksimum teoretis dalam bit untuk kartu apa pun di dek adalah log (52) / log (2) ~ = 5,7 bit. Tetapi data saya tidak pernah benar-benar rusak jauh di atas 5 bit. Penasaran, saya membuat array dari 52 elemen dengan Python, mengocok array itu:

>>> import random
>>> r = random.SystemRandom()
>>> d = [x for x in xrange(1,52)]
>>> r.shuffle(d)
>>> print d
[20, 51, 42, 44, 16, 5, 18, 27, 8, 24, 23, 13, 6, 22, 19, 45, 40, 30, 10, 15, 25, 37, 52, 34, 12, 46, 48, 3, 26, 4, 1, 38, 32, 14, 43, 7, 31, 50, 47, 41, 29, 36, 39, 49, 28, 21, 2, 33, 35, 9, 17, 11]

Menghitung hasil entropi per kartu sekitar 4,8 bit. Melakukan ini selusin kali atau lebih menunjukkan hasil yang serupa bervariasi antara 5,2 bit dan 4,6 bit, dengan rata-rata 4,8 hingga 4,9. Jadi melihat nilai entropi mentah data saya tidak cukup, kalau tidak saya bisa menyebutnya baik di 5 shuffles.

Ketika saya melihat lebih dekat pada data saya, saya perhatikan jumlah "ember nol". Ini adalah kotak di mana tidak ada data untuk delta di antara permukaan kartu untuk nomor itu. Misalnya, ketika mengurangi nilai dua kartu yang berdekatan, tidak ada hasil "15" setelah semua 52 delta telah dihitung.

Saya melihat bahwa itu akhirnya mengendap sekitar 17-18 "zero bucket" sekitar 11-12 shuffles. Benar saja, dek saya yang dikocok melalui Python rata-rata 17-18 "nol ember", dengan tinggi 21 dan rendah 14. Mengapa 17-18 adalah hasil yang ditetapkan, saya belum dapat menjelaskan ... belum. Tapi, sepertinya saya ingin keduanya ~ 4,8 bit entropi DAN 17 "zero bucket".

Dengan stock riffle shuffling saya, itu 11-12 shuffles. Dengan sayangku, itu 6-7. Jadi, ketika datang ke permainan, saya akan merekomendasikan cut-and-shuffles. Tidak hanya ini menjamin bahwa kartu atas dan bawah tercampur ke dalam geladak pada setiap acak, itu juga lebih cepat dari 11-12 shuffle. Saya tidak tahu tentang Anda, tetapi ketika saya bermain kartu dengan keluarga dan teman-teman saya, itu tidak cukup sabar bagi saya untuk melakukan 12 riffle shuffles.

Aaron Toponce
sumber