2012-06-28 28 views
5

Có lẽ tôi đang làm điều gì đó sai trong khi z-normalizing mảng của tôi. Ai đó có thể xem cái này và gợi ý chuyện gì đang xảy ra?Giá trị đầu ra khác nhau giữa R và Python?

Trong R:

> data <- c(2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34) 
> data.mean <- mean(data) 
> data.sd <- sqrt(var(data)) 
> data.norm <- (data - data.mean)/data.sd 
> print(data.norm) 
[1] -0.9796808 -0.8622706 -0.6123005 0.8496459 1.7396910 1.5881940 1.0958286 0.5277147 0.4709033 -0.2865819 
[11] 0.0921607 -0.2865819 -0.9039323 -1.1955641 -1.2372258 

Trong Python sử dụng NumPy:

>>> import string 
>>> import numpy as np 
>>> from scipy.stats import norm 
>>> data = np.array([np.array([2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34])]) 
>>> data -= np.split(np.mean(data, axis=1), data.shape[0]) 
>>> data *= np.split(1.0/data.std(axis=1), data.shape[0]) 
>>> print data 

[[-1.01406602 -0.89253491 -0.63379126 0.87946705 1.80075126 1.64393692 
    1.13429034 0.54623659 0.48743122 -0.29664045 0.09539539 -0.29664045 
    -0.93565885 -1.23752644 -1.28065039]] 

Tôi có sử dụng numpy sai?

+0

Tại sao bạn đặt 'dữ liệu' làm np.array bên trong một np.array khác? –

+0

@HughBothwell: Ồ ... Tôi không nhận thấy điều đó. Điều này đã được đơn giản hóa từ một đoạn mã lớn hơn, nơi dữ liệu là một mảng các mảng. – Legend

+1

Chỉ để ghi lại, trong R bạn có thể chuẩn hóa bằng cách sử dụng 'data.norm <- scale (dữ liệu, center = TRUE, scale = TRUE)' – Marius

Trả lời

9

Tôi tin rằng kết quả NumPy của bạn là chính xác. Tôi sẽ làm việc bình thường trong một cách đơn giản hơn, mặc dù:

>>> data = np.array([2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34]) 
>>> data -= data.mean() 
>>> data /= data.std() 
>>> data 
array([-1.01406602, -0.89253491, -0.63379126, 0.87946705, 1.80075126, 
     1.64393692, 1.13429034, 0.54623659, 0.48743122, -0.29664045, 
     0.09539539, -0.29664045, -0.93565885, -1.23752644, -1.28065039]) 

Sự khác biệt giữa hai kết quả của bạn nằm trong tiến trình bình thường: với r như là kết quả R:

>>> r/data 
array([ 0.96609173, 0.96609173, 0.96609173, 0.96609179, 0.96609179, 0.96609181, 0.9660918 , 0.96609181, 
     0.96609179, 0.96609179,  0.9660918 , 0.96609179, 0.96609175, 0.96609176, 0.96609177]) 

Như vậy, hai kết quả của bạn là chủ yếu là tỷ lệ thuận với nhau. Do đó, bạn có thể muốn so sánh độ lệch chuẩn thu được với R và với Python.

PS: Bây giờ tôi đang nghĩ đến việc nó, nó có thể là sự khác biệt trong NumPy và R không được định nghĩa trong cùng một cách: cho N yếu tố, một số công cụ bình thường hóa với N-1 thay vì N, khi tính phương sai. Bạn có thể muốn kiểm tra điều này.

PPS: Dưới đây là lý do cho sự khác biệt: sự khác biệt về yếu tố xuất phát từ hai công ước bình thường khác nhau: yếu tố quan sát được chỉ đơn giản là sqrt (14/15) = 0,9660917 ... (vì dữ liệu có 15 yếu tố). Vì vậy, để có được trong R kết quả tương tự như trong Python, bạn cần phải chia kết quả R theo yếu tố này.

+0

+1 Cảm ơn bạn đã xác nhận. Cách tiếp cận này có thể mở rộng cho trường hợp khi dữ liệu có nhiều mảng bên trong (như trong câu hỏi của tôi nhưng có nhiều phần tử mảng) không? Ngoài ra, bất kỳ ý tưởng tại sao kết quả từ 'R' là khác nhau? – Legend

+1

@Legend Tôi có thể xác nhận rằng R sử dụng n-1 làm mẫu số và chỉ nghĩ rằng đó có thể là sự khác biệt. Là một anh chàng thống kê, tôi thực sự là một chút sốc rằng numpy sẽ sử dụng n theo mặc định, nhưng tôi chắc chắn rằng ai đó nói rằng chỉ là đối diện về R ngay bây giờ. – joran

+0

@Legend: Tham số 'axis = 1' mà bạn sử dụng trong câu trả lời là cách để đi, nếu bạn có mảng bên trong mảng. – EOL

14

Lý do bạn nhận được các kết quả khác nhau phải làm với cách tính độ lệch/phương sai chuẩn. R tính toán bằng mẫu số N-1, trong khi tính toán khối u bằng cách sử dụng mẫu số N. Bạn có thể nhận được một kết quả gumpy bằng kết quả R bằng cách sử dụng data.std(ddof=1), mà nói numpy để sử dụng N-1 làm mẫu số khi tính toán phương sai.

+1

+1 cho «ddof = 1', đơn giản hơn việc đặt yếu tố hiệu chỉnh bằng tay. – EOL

+0

+1 Cảm ơn bạn đã tiếp cận! – Legend

Các vấn đề liên quan