Kiểm tra nếu một chuỗi ký tự không ngẫu nhiên


8

Bối cảnh
Giả sử chúng ta có một bảng chữ cái A,B, C, D, sau đó chúng ta xem qua một số dữ liệu và tìm thấy một "từ" có DDDDDDDDCDDDDDDkhả năng tìm thấy sự ngẫu nhiên này có vẻ thấp đối với tôi trong khi việc tìm kiếm BABDCABCDACDBACDcó vẻ ít ngẫu nhiên hơn.

Câu hỏi
Làm thế nào tôi nên kiểm tra xem các chuỗi tôi gặp không phải là ngẫu nhiên?

Tôi đã thử một số thứ trong R, ví dụ, mã hóa các chữ cái và so sánh chúng với các hoán vị. Nhưng mã hóa trước khá rườm rà, có thể có một cách tiếp cận trực tiếp hơn cho việc này.


12
Chính xác thì bạn có ý gì bởi "ngẫu nhiên" trong bối cảnh này?
gung - Phục hồi Monica

3
Bạn có thể tạo một máy trạng thái n bit và sau đó ghi lại có bao nhiêu dự đoán sai. Sắp xếp giống như dự đoán nhánh của CPU.
alexyorke

1
Bạn có thể tính xác suất để một chuỗi ký tự được tạo bởi một quá trình cụ thể đã biết. Cho dù đó là "ngẫu nhiên" không thể được biết (và có lẽ không phải là một câu hỏi có ý nghĩa).
OrangeDog

2
Bạn có thể kiểm tra với kế toán .
hlovdal

2
Nếu bạn tập trung vào tần số chữ cái thay vì chuỗi, kiểm tra Chi bình phương tần số thực tế so với dự kiến ​​là phổ biến. Đó là, nếu ví dụ đầu tiên của bạn là "lẻ" vì nó có quá nhiều "D", trong khi ví dụ thứ hai của bạn có số "A", "B", "C" và "D" khá bằng nhau, thì bạn ' d muốn so sánh số lượng của từng A, B, C và D với bất cứ điều gì bạn mong đợi. (Có thể gần bằng số A, B, C, D hoặc có thể gấp đôi số A của B và gấp đôi số B so với C hoặc D.)
Wayne

Câu trả lời:


19

cơ hội tìm thấy ngẫu nhiên này có vẻ thấp đối với tôi trong khi tìm BABDCABCDACDBACD có vẻ ít ngẫu nhiên hơn.

Tại sao lại như vậy? Nếu tỷ lệ chung của các chữ cái A ... D bằng 0,25 cho mỗi chữ cái và mỗi chữ cái độc lập với chữ cái khác, thì cả hai từ đều có xác suất chính xác như nhau. Nếu sự phân phối các chữ cái khác nhau, thì dĩ nhiên xác suất tạo cả hai từ có thể khác nhau.

Bạn có thể thử tìm các từ "độ phức tạp thấp", ví dụ các từ có tỷ lệ đặc biệt cao của một chữ cái (bạn có thể sử dụng thông tin Shannon như được đề xuất trong phản hồi khác và trong phân tích trình tự sinh học có nhiều cách tiếp cận khác), nhưng có không phải là thử nghiệm cho "tính ngẫu nhiên", vì không có giả định hoặc kiến ​​thức nào thêm về những gì bạn đang thực sự phân tích, thuật ngữ "tính ngẫu nhiên" không có nghĩa gì.


10
"Cả hai từ đều có xác suất chính xác như nhau" sẽ là một nơi tuyệt vời để nhấn mạnh đậm.
Tashus

1
"Nếu tỷ lệ chung của các chữ cái A ... D bằng 0,25 cho mỗi chữ cái ...". Không, thực sự mọi từ có thể đều có khả năng như bất kỳ từ nào khác, bất kể tỷ lệ các chữ cái trong từ là gì.
DJClayworth

6
@DJClayworth Tôi tin rằng mục đích của dòng đó là nói rằng nếu thay vì A: .25 B: .25 C: .25 D.25, chúng ta có A: .5, B: .25, C: .125, D : .125, cơ hội nhận được từ ABAA có nhiều khả năng trong trường hợp thứ hai hơn nhiều so với trường hợp thứ nhất và CDBD có khả năng tương tự như ABAA cho kịch bản đầu tiên, nhưng ít có khả năng hơn ABAA trong lần thứ hai. Do đó, cơ hội của một từ nhất định phụ thuộc vào 'tỷ lệ' của các chữ cái so với các tỷ lệ có thể khác.
ale10ander

17

Bạn có thể thử thông tin Shannon: trong đó, , là số đếm của một số chữ trong từ và.

H=i=0nPilog2(Pi)
Pi=cincicn=|word|

Đối với từ đầu tiên bạn có . Trong từ thứ hai bạn có .H=0.35H=2

Nếu entropy cao, bạn có thể nghĩ nó là ngẫu nhiên hơn so với một từ khác có entropy thấp hơn.


Đây là một cách tốt để phát hiện tính không thể đoán trước của chuỗi và tôi đã nâng cao, nhưng tiêu chí của bạn sẽ cho kết quả tương tự cho cả hai bababbaabbaaaabbbbbb. Việc thừa nhận rất lỏng lẻo, khái niệm "ngẫu nhiên" được OP sử dụng có lẽ sẽ coi cái trước là "ngẫu nhiên" hơn cái sau.
ymbirtt

8

Các câu trả lời khác ở đây đã tập trung vào sự xuất hiện chung của các chữ cái khác nhau trong chuỗi, có thể là một khía cạnh của "tính ngẫu nhiên" dự kiến. Tuy nhiên, một khía cạnh quan tâm khác là sự ngẫu nhiên rõ ràng theo thứ tự các chữ cái trong chuỗi. Tối thiểu, tôi sẽ nghĩ rằng "tính ngẫu nhiên" đòi hỏi khả năng trao đổi của vectơ các chữ cái, có thể được kiểm tra bằng cách sử dụng "chạy thử". Phép thử chạy đếm số lần "chạy" trong chuỗi và so sánh tổng số lần chạy với phân phối null của nó theo giả thuyết null về khả năng trao đổi, cho một vectơ có cùng chữ cái. Định nghĩa chính xác về những gì cấu thành một "chạy" phụ thuộc vào thử nghiệm cụ thể (xem ví dụ, một câu trả lời tương tự ở đây), nhưng trong trường hợp này, với các danh mục danh nghĩa, định nghĩa tự nhiên là đếm bất kỳ chuỗi liên tiếp nào chỉ bao gồm một chữ cái là một "lần chạy" duy nhất.

Ví dụ, chuỗi của bạn BABD-CABC-DACD-BACDtrông prima facie không ngẫu nhiên đối với tôi (không có chữ cái nào xuất hiện với chính nó, điều này có lẽ không bình thường đối với một chuỗi dài như vậy). Để kiểm tra điều này một cách chính thức, chúng tôi có thể thực hiện một bài kiểm tra khả năng trao đổi. Trong chuỗi này, chúng tôi cón=16 chữ cái (bốn của mỗi chữ cái) và có r=16chạy, mỗi bao gồm một trường hợp duy nhất của một chữ cái. Số lần chạy quan sát có thể được so sánh với phân phối null của nó theo giả thuyết về khả năng trao đổi. Chúng ta có thể thực hiện điều này thông qua mô phỏng, mang lại phân phối null mô phỏng và giá trị p cho thử nghiệm. Kết quả cho chuỗi ký tự này được hiển thị trong biểu đồ bên dưới.

nhập mô tả hình ảnh ở đây

Đối với chuỗi này, giá trị p cho thử nghiệm chạy (theo giả thuyết null về khả năng trao đổi) là p=0.0537. Điều này có ý nghĩa ở mức ý nghĩa 10%, nhưng không phải ở mức ý nghĩa 5%. Có một số bằng chứng cho thấy một loạt không thể trao đổi (nghĩa là thứ tự không ngẫu nhiên), nhưng bằng chứng không đặc biệt mạnh. Với chuỗi được quan sát lâu hơn, kiểm tra chạy sẽ có sức mạnh lớn hơn để phân biệt chuỗi có thể trao đổi với chuỗi không thể trao đổi. (Như bạn có thể thấy, phán đoán prima facie ban đầu của tôi rằng chuỗi này không ngẫu nhiên có thể sai - giá trị p không thực sự thấp như tôi mong đợi.)

Cuối cùng, điều quan trọng cần lưu ý là thử nghiệm này chỉ xem xét tính ngẫu nhiên của thứ tự các chữ cái trong chuỗi - nó lấy số lượng chữ cái của mỗi loại làm đầu vào cố định. Thử nghiệm này sẽ phát hiện tính không ngẫu nhiên theo nghĩa không thể trao đổi của các chữ cái trong chuỗi, nhưng nó sẽ không kiểm tra "tính ngẫu nhiên" theo nghĩa xác suất tổng thể của các chữ cái khác nhau. Nếu cái sau cũng là một phần của ý nghĩa "ngẫu nhiên" được chỉ định thì thử nghiệm chạy này có thể được tăng cường bằng một thử nghiệm khác xem xét tổng số các chữ cái và so sánh nó với phân phối null được giả thuyết.


Mã R: Biểu đồ và giá trị p ở trên được tạo bằng Rmã sau :

#Define the character string vector (as factors)
x <- factor(c(2,1,2,4, 3,1,2,3, 4,1,3,4, 2,1,3,4), 
            labels = c('A', 'B', 'C', 'D'))

#Define a function to calculate the runs for an input vector
RUNS <- function(x) { n <- length(x);
                      R <- 1;
                      for (i in 2:n) { R <- R + (x[i] != x[i-1]) }
                      R; }

#Simulate the runs statistic for k permutations
k <- 10^5;
set.seed(12345);
RR <- rep(0, k);
for (i in 1:k) { x_perm <- sample(x, length(x), replace = FALSE);
                 RR[i] <- RUNS(x_perm); }

#Generate the frequency table for the simulated runs
FREQS <- as.data.frame(table(RR));

#Calculate the p-value of the runs test
R      <- RUNS(x);
R_FREQ <- FREQS$Freq[match(R, FREQS$RR)];
p      <- sum(FREQS$Freq*(FREQS$Freq <= R_FREQ))/k;

#Plot estimated distribution of runs with test
library(ggplot2);
ggplot(data = FREQS, aes(x = RR, y = Freq/k, fill = (Freq <= R_FREQ))) +
geom_bar(stat = 'identity') +
geom_vline(xintercept = match(R, FREQS$RR)) +
scale_fill_manual(values = c('Grey', 'Red')) +
theme(legend.position = 'none',
      plot.title      = element_text(hjust = 0.5, face = 'bold'),
      plot.subtitle   = element_text(hjust = 0.5),
      axis.title.y    = element_text(margin = margin(t = 0, r = 10, b = 0, l = 0))) +
labs(title    = 'Runs Test - Plot of Distribution of Runs under Exchangeability',
     subtitle = paste0('(Observed runs is black line, p-value = ', p, ')'),
     x = 'Runs', y = 'Estimated Probability'); 

Tôi đã phá vỡ trình tự với dấu gạch ngang chỉ để dễ đọc hơn; dấu gạch ngang không có ý nghĩa đối với phân tích.


1
Hấp dẫn! chắc chắn sẽ xem kịch bản R
KingBoomie

1

Giả sử chuỗi ký tự đủ dài, bạn có thể áp dụng các bài kiểm tra Tính ngẫu nhiên trên dữ liệu.

Một tập hợp các bài kiểm tra như vậy được gọi là các bài kiểm tra cực đoan :

Các thử nghiệm cực đoan là một loạt các thử nghiệm thống kê để đo lường chất lượng của một bộ tạo số ngẫu nhiên. Chúng được phát triển bởi George Marsaglia trong nhiều năm và được xuất bản lần đầu tiên vào năm 1995 trên một đĩa CD-ROM có số ngẫu nhiên.

Chúng liên quan đến một, có lẽ là tùy ý, tập hợp các thử nghiệm như:

  • Không gian sinh nhật
  • Hoán vị chồng chéo
  • Cấp bậc của ma trận
  • Thử nghiệm khỉ
  • Đếm 1 giây
  • Kiểm tra bãi đậu xe
  • Kiểm tra khoảng cách tối thiểu
  • Kiểm tra hình cầu ngẫu nhiên
  • Kiểm tra bóp
  • Kiểm tra tổng chồng chéo
  • Chạy thử nghiệm
  • Bài kiểm tra craps

Một chuỗi dữ liệu ngẫu nhiên tốt sẽ vượt qua các bài kiểm tra này.

Tuy nhiên, vượt qua các thử nghiệm này không đủ để chứng minh các con số không thực sự mã hóa tín hiệu thực. Chúng có thể là đầu ra từ một thói quen mã hóa chất lượng cao.

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.