2012-08-29 34 views
8

Tôi có một số lớn scipy.sparse.csc_matrix và muốn bình thường hóa nó. Đó là trừ giá trị trung bình của cột từ mỗi phần tử và chia cho độ lệch chuẩn của cột (std) i.Làm cách nào để tính phương sai của cột của ma trận thưa thớt trong Scipy?

scipy.sparse.csc_matrix.mean() nhưng có cách nào hiệu quả để tính phương sai hoặc tiêu chuẩn không?

+5

Tôi sẽ đăng một số mã python để tính toán phương sai theo kiểu vectơ, nhưng nếu bạn "bình thường hóa" bạn sẽ không còn bất kỳ phần tử nào, vì vậy trước khi tôi làm, hãy cho chúng tôi biết rằng bạn không làm rối tung lên cấu trúc thưa thớt của bạn. – seberg

+0

Đó là một điểm rất tốt Sebastian, cảm ơn bạn. Tôi không nghĩ về điều đó. – nickponline

Trả lời

5

Bạn có thể tính toán phương sai cho mình sử dụng giá trị trung bình, với formula sau:

E[X^2] - (E[X])^2 

E[X] đứng cho giá trị trung bình. Vì vậy, để tính toán E[X^2], bạn sẽ phải tạo hình vuông csc_matrix và sau đó sử dụng chức năng mean. Để có được (E[X])^2, bạn chỉ cần căn chỉnh kết quả của hàm mean thu được bằng cách sử dụng đầu vào bình thường.

+2

Để vuông ma trận, để đơn giản: 'c = matrix.copy(); c.data ** = 2' và sau đó là 'c.mean (0); del c' (chỉ có thể thay thế '.data'). Nhưng tôi duy trì rằng OP âm thanh nói sai để trừ đi tất cả các yếu tố. – seberg

+0

Cảm ơn câu trả lời và nhận xét. – nickponline

3

Cách hiệu quả thực sự là để tăng mật độ toàn bộ ma trận, sau đó chuẩn hóa nó theo cách thông thường với

X = X.toarray() 
X -= X.mean() 
X /= X.std() 

Như @Sebastian đã lưu ý trong ý kiến ​​của mình, tiêu chuẩn hóa phá hủy các cấu trúc thưa thớt (giới thiệu rất nhiều phi các phần tử không) trong bước trừ, vì vậy không sử dụng giữ ma trận ở định dạng thưa thớt.

+0

Điều này không thực sự đúng. Sử dụng công thức trong câu trả lời của Sicco cho phép sử dụng thưa thớt để giảm thời gian tính toán. –

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