2010-12-28 36 views
16

Về cơ bản, lấy ma trận và thay đổi nó sao cho giá trị trung bình bằng 0 và phương sai là 1. Tôi đang sử dụng mảng của numpy để nếu nó có thể làm nó tốt hơn, nhưng tôi có thể tự thực hiện miễn là tôi có thể tìm một thuật toán.Làm cách nào để chuẩn hóa ma trận?

chỉnh sửa: nvm nimrodm có thực hiện tốt hơn

+1

Xác định "thay đổi". Điều gì sẽ xảy ra nếu, giả sử, chúng ta chỉ thay thế ma trận bằng ma trận nhận dạng hoặc cái gì đó? Những loại biến đổi nào là OK? –

+0

Chỉ vì tò mò, tại sao bạn cần phải làm điều này? –

+0

Tôi đang cố triển khai thuật toán thị giác máy tính yêu cầu thực hiện thao tác này trong các bước trung gian. Tôi nghĩ rằng đó là bởi vì nó là một yêu cầu cho PCA nhưng tôi không chắc chắn. – pnodbnda

Trả lời

0

Hãy mỗi phần tử và trừ với giá trị trung bình và sau đó chia cho độ lệch chuẩn.

Bắn tôi, tôi không biết python. Nói chung ở trên là

mu = Average() 
sig = StandardDeviation() 
for(i=0;i<rows;i++) 
{ 
    for(j=0;j<cols;j++) 
    { 
     A[i,j] = (A[i,j]-mu)/sig; 
    } 
} 
+4

Lưu ý: thao tác này sẽ hoạt động nhưng sẽ chậm đối với các ma trận lớn. Câu trả lời của @ nimrodm sẽ nhanh hơn nhiều vì nó sẽ được hưởng lợi từ việc tối ưu hóa của numpy. –

+2

Có, vui lòng sử dụng 'Numpy'. Tôi chỉ muốn thể hiện "trong lý thuyết" cách bình thường hóa. – ja72

47

Giá trị trừ trung bình của A từ mỗi phần tử (giá trị trung bình mới là 0), sau đó bình thường hóa kết quả theo độ lệch chuẩn.

from numpy import * 
A = (A - mean(A))/std(A) 

Trên đây là cho tiêu chuẩn hóa toàn bộ ma trận như một toàn thể, Nếu A có nhiều kích thước và bạn muốn chuẩn hóa từng cột riêng, xác định axis:

from numpy import * 
A = (A - mean(A, axis=0))/std(A, axis=0) 

Luôn luôn kiểm tra bằng tay những gì các một-liners đang làm trước khi tích hợp chúng vào mã của bạn. Một sự thay đổi đơn giản trong định hướng hoặc kích thước có thể thay đổi mạnh mẽ (âm thầm) những hoạt động nào thực hiện các thao tác trên chúng.

+0

bạn có thể muốn cập nhật 'A' chỉ khi' std (A)> 0' để tránh phân chia bằng 0 và 'NaN' giá trị –

+0

Điều này có thể xảy ra khi A được biểu diễn dưới dạng danh sách các danh sách không? – Neamah

+0

@Neamah Tại sao không chỉ [chuyển đổi] (http://stackoverflow.com/questions/10346336/list-of-lists-into-numpy-array) thành mảng có nhiều mảng? – kingledion

6
import scipy.stats as ss 

A = np.array(ss.zscore(A)) 
3
from sklearn.preprocessing import StandardScaler 

standardized_data = StandardScaler().fit_transform(your_data) 

Ví dụ:

>>> import numpy as np 
>>> from sklearn.preprocessing import StandardScaler 

>>> data = np.random.randint(25, size=(4, 4)) 
>>> data 
array([[17, 12, 4, 17], 
     [ 1, 16, 19, 1], 
     [ 7, 8, 10, 4], 
     [22, 4, 2, 8]]) 

>>> standardized_data = StandardScaler().fit_transform(data) 
>>> standardized_data 
array([[ 0.63812398, 0.4472136 , -0.718646 , 1.57786412], 
     [-1.30663482, 1.34164079, 1.55076242, -1.07959124], 
     [-0.57735027, -0.4472136 , 0.18911737, -0.58131836], 
     [ 1.24586111, -1.34164079, -1.02123379, 0.08304548]]) 

trình tốt trên các tập dữ liệu lớn.

+0

bạn có thể sử dụng ctrl + k để thụt lề tất cả mọi thứ thay vì backticks. –

1

Sử dụng sklearn.preprocessing.scale.

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html

Dưới đây là ví dụ.

>>> from sklearn import preprocessing 
>>> import numpy as np 
>>> X_train = np.array([[ 1., -1., 2.], 
...      [ 2., 0., 0.], 
...      [ 0., 1., -1.]]) 
>>> X_scaled = preprocessing.scale(X_train) 
>>> X_scaled 
array([[ 0. ..., -1.22..., 1.33...], 
     [ 1.22..., 0. ..., -0.26...], 
     [-1.22..., 1.22..., -1.06...]]) 

http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling

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