2012-06-06 87 views
17

Tôi hiểu những gì set.seed() làm và khi nào tôi có thể sử dụng nó, nhưng tôi vẫn có nhiều câu hỏi về chức năng này. Dưới đây là một số ít:Câu hỏi về set.seed() trong R

  1. Có thể "đặt lại" set.seed() thành điều gì đó "ngẫu nhiên hơn" nếu bạn đã gọi set.seed() trước đó trong phiên của mình không? Điều đó có cần thiết không?
  2. Có thể xem hạt giống mà R hiện đang sử dụng không?
  3. Có cách nào để tạo set.seed() cho phép hạt giống chữ và số hay không, cách người ta có thể nhập chúng tại random.org (chắc chắn bạn đang ở chế độ nâng cao và xem "Phần 3" của biểu mẫu để xem ý tôi là gì)?
+4

1. Tôi không nghĩ điều đó là cần thiết; 2. '? .Random.seed' (nó phức tạp hơn một chút, nhưng có lẽ ai đó sẽ trả lời) –

+2

Đọc'? RNG' để nhận được hầu hết các câu trả lời của bạn – Andrie

Trả lời

18

Just for fun:

set.seed.alpha <- function(x) { 
    require("digest") 
    hexval <- paste0("0x",digest(x,"crc32")) 
    intval <- type.convert(hexval) %% .Machine$integer.max 
    set.seed(intval) 
} 

Vì vậy, bạn có thể làm:

set.seed.alpha("hello world") 

(trên thực tế x thể được bất kỳ Đối tượng R, không chỉ là chuỗi ký tự chữ và số)

+0

Đẹp" chỉ để vui thôi " câu trả lời. Trên thực tế, tôi muốn tạo một vectơ của các hạt giống để sử dụng trong một hàm. Vì vậy, giả sử rằng tôi đang tạo ra hạt giống dựa trên một đối tượng có tên 'village.names', tôi có lẽ sẽ làm một cái gì đó giống như:' hexval <- paste0 ("0x", sapply (village.names, digest, "crc32")) ; intval <- type.convert (hexval) %% .Machine $ integer.max' để tạo ra một danh sách các hạt giống để truyền vào một hàm khác. Cảm ơn tất cả các đề xuất của bạn cho đến nay! – A5C1D2H2I1M1N2O1R2T1

12

Có thể, nếu bạn đặt hạt giống thành chữ số cuối cùng trong kỷ nguyên thời gian của bạn, nhưng thực sự không cần thiết. Mục đích sử dụng PRNGs là bạn đặt hạt giống một lần vào lúc bắt đầu một phiên và sử dụng các biến thể được tạo liên tiếp từ đó. Làm những việc khác nhau, và bạn không được tận hưởng những tính chất lý thuyết và thực nghiệm tốt mà R RNG có.

Nhưng tôi không chắc bạn có thực sự hiểu mục đích của set.seed hay không. Nó không thực sự có cho bạn để có được 'số ngẫu nhiên hơn'. Nếu bạn đang làm một số loại ứng dụng mà R PRNG không đủ (ví dụ, nếu bạn yêu cầu ngẫu nhiên mật mã), bạn cũng có thể tạo tất cả các số ngẫu nhiên của mình bằng một số phương thức thay thế và sử dụng chúng trực tiếp. Mục đích thực sự của set.seed là tạo ra khả năng tái tạo trong các kết quả bằng cách sử dụng các RNG. Nếu bạn bắt đầu phân tích tương tự bằng cách sử dụng cùng một chuỗi các thế hệ số ngẫu nhiên và đặt hạt giống thành cùng một giá trị, bạn sẽ luôn nhận được kết quả tương tự. Điều này hữu ích trong việc gỡ lỗi và cho những người khác xem xét kết quả của bạn.

Để sử dụng thời gian kỷ nguyên, làm một cái gì đó giống như

t <- as.numeric(Sys.time()) 
seed <- 1e8 * (t - floor(t)) 
set.seed(seed); print(seed) 
+0

Tôi hiểu mục đích của 'set.seed()' về việc làm cho mọi thứ có thể tái sản xuất và vân vân. Điều tôi đang nhìn là, tôi nói 'set.seed (123); a = mẫu (300, 30); b = mẫu (300, 30) 'nhưng tôi chỉ quan tâm đến việc tạo ra' a' "có thể tái sản xuất" - tôi muốn kết quả của 'b' khác nhau mỗi lần. Với tôi, điều này có nghĩa là ở giữa chạy dòng cho 'a' và dòng cho' b', tôi cần phải thiết lập lại hạt giống bằng cách nào đó. – A5C1D2H2I1M1N2O1R2T1

+6

Oh okay. Vâng, hãy thử một cái gì đó như 'as.numeric (Sys.time()) -> t; set.seed ((t - tầng (t)) * 1e8 -> hạt giống); in (hạt giống) 'sẽ có hiệu lực cho hầu hết các mục đích. – Fhnuzoag

+2

Fhnuzoag mà phải là một câu trả lời, không phải là một bình luận, IMO. –

6

Đối với câu hỏi của bạn 3 có chức năng char2seed trong gói TeachingDemos sẽ lấy một chuỗi ký tự (số alhpa) và chuyển đổi thành số nguyên và theo mặc định sử dụng để đặt hạt giống mới. Ý tưởng là sinh viên có thể sử dụng tên của họ (hoặc một số tổ hợp/tập hợp tên) làm hạt giống để mỗi sinh viên có được một tập dữ liệu khác nhau, nhưng giáo viên có thể tái tạo tập dữ liệu của từng sinh viên.

+0

Cảm ơn bạn đã đề xuất. Tôi đã không xác định nó trong câu hỏi ban đầu của tôi, nhưng tôi cần phải thực sự tạo ra một vectơ hạt giống dựa trên một vectơ của các chuỗi ký tự. Có vẻ như chức năng của bạn không thể làm điều đó; tôi có đúng không Gói tuyệt vời, nhân tiện. – A5C1D2H2I1M1N2O1R2T1

+1

Phiên bản hiện tại sẽ chỉ tạo ra 1 hạt giống, không phải là một vector (theo thiết kế cho các mục đích trên), có một [[1]] mã hóa cứng.Nhưng nó có thể được sửa đổi (sử dụng thay vì lấy phần tử đầu tiên của kết quả 'strsplit') để làm việc với vectơ, hoặc sử dụng đơn giản' sapply', 'mapply', hoặc' Vectorize' có thể được sử dụng với 'char2seed 'để có được kết quả vectơ từ đầu vào vectơ. –

2

Để có câu trả lời cho 2, trước tiên hãy xem trang trợ giúp ?RNGkind.

Để tìm loại RNG được sử dụng:

RNGkind() 
# [1] "Mersenne-Twister" "Inversion" 

Các Mersenne Twister là mặc định.

Từ trang trợ giúp:

‘Mersenne-Twister":’Từ Matsumoto và Nishimura (1998).A GFSR bị xoắn với khoảng thời gian 2^19937 - 1 và equidistribution trong 623 thứ nguyên liên tiếp (trong toàn bộ thời gian). ‘hạt giống’ là một tập hợp các số nguyên 32 bit có kích thước 624 cộng với một vị trí hiện tại là trong tập hợp đó.

Để tìm hạt giống hiện tại đang sử dụng, trước tiên bạn cần gọi đến trình tạo số ngẫu nhiên.

runif(1, 0, 1)                                     
# [1] 0.9834062                                      
.Random.seed 
# [Gives a 626 length vector] 

Calling set.seed(some_integer) tiếp theo .Random.seed, sẽ luôn luôn cung cấp cho cùng một vector 626 chiều dài nếu bạn sử dụng cùng một some_integer. Nói cách khác, vector dài 626 được xác định chỉ bởi some_integer, tất nhiên là một cái đang sử dụng Misterenne Twister, tất nhiên.

Ngoài ra, tất nhiên, chạy set.seed với một số giá trị cố định sẽ cung cấp cho bạn các giá trị giống nhau cho các cuộc gọi đến các quy trình số ngẫu nhiên sau nó. Đó là cách sử dụng chính cho nó trong thực tế, để cho khả năng tái sản xuất. Ví dụ.

set.seed(1) 
runif(5, 0, 1) 
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 
rnorm(1, 0, 1) 
# [1] 1.272429 
set.seed(1) 
runif(5, 0, 1) 
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 
rnorm(1, 0, 1) 
# [1] 1.272429 

Tất cả mã trình tạo số cơ bản trong R nằm trong tệp src/main/RNG.c trong mã nguồn.

Đó là trong C, nhưng khá dễ làm theo.

0

Tôi có vấn đề tương tự như trong câu hỏi 1. sau đó tôi tìm tôi chỉ đơn giản có thể thiết lập lại hạt trong vòng lặp theo:

set.seed(123) 
x<- rnorm(10,1,1) 
set.seed(null) 

Bằng cách này ở cuối mỗi vòng lặp hạt giống đã bị xóa. Nó làm việc cho tôi.

+0

Cảm ơn câu trả lời. Một cách tiếp cận phổ biến hơn/chính thống sẽ là 'rm (.Random.seed, envir = globalenv())', được đề cập trong tệp trợ giúp cho '? .Random.seed' ... mà tôi chỉ đến sau câu hỏi này :-) – A5C1D2H2I1M1N2O1R2T1

+0

'set.seed (null)' đã không hoạt động đối với tôi. Có cách nào khác để thiết lập lại giá trị hạt giống hoặc để vô hiệu hóa nó. – mockash