2010-12-28 11 views
16

असल में, एक मैट्रिक्स लें और इसे बदलें ताकि इसका मतलब 0 के बराबर हो और भिन्नता 1 हो। मैं numpy के सरणी का उपयोग कर रहा हूं ताकि अगर यह पहले से ही कर सके तो यह बेहतर होगा, लेकिन जब तक मैं कर सकता हूं तब तक मैं इसे स्वयं लागू कर सकता हूं एक एल्गोरिदम खोजें।मैं मैट्रिक्स को कैसे मानकीकृत करूं?

संपादित करें: nvm nimrodm बेहतर कार्यान्वयन

+1

"बदलाव" परिभाषित करें। क्या होगा, अगर हम पहचान मैट्रिक्स या कुछ के साथ मैट्रिक्स को प्रतिस्थापित करते हैं? किस तरह के परिवर्तन ठीक हैं? –

+0

जिज्ञासा से बाहर, आपको ऐसा करने की आवश्यकता क्यों है? –

+0

मैं एक कंप्यूटर दृष्टि एल्गोरिदम लागू करने की कोशिश कर रहा हूं जो इस ऑपरेशन को मध्यवर्ती चरणों में निष्पादित करने के लिए कहता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह पीसीए के लिए एक आवश्यकता है लेकिन मुझे यकीन नहीं है। – pnodbnda

उत्तर

0

प्रत्येक तत्व ले लो और इनकी औसत घटाना और फिर मानक विचलन से विभाजित है।

मुझे गोली मारो, मुझे अजगर पता नहीं है। सामान्य तौर पर ऊपर

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

नोट: यह काम करेगा, लेकिन यह बड़े matrices के लिए धीमा होने जा रहा है। @ निमोडम का जवाब बहुत तेज होगा क्योंकि यह numpy के अनुकूलन से लाभान्वित होगा। –

+2

हां, कृपया 'Numpy' का उपयोग करें। मैं सिर्फ "सिद्धांत में" दिखाना चाहता था कि कैसे सामान्यीकृत किया जाए। – ja72

47

निम्नलिखित (नया माध्य 0 है), तो मानक विचलन से परिणाम को सामान्य प्रत्येक तत्व से एक का मतलब घटा देती है।

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

से ऊपर, एक पूरे के रूप में पूरे मैट्रिक्स के मानकीकरण के लिए है एक कई आयाम हैं और आप व्यक्तिगत रूप से प्रत्येक स्तंभ का मानकीकरण करने, axis निर्दिष्ट हैं:

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

हमेशा हाथ से सत्यापित करें कि इन एक-लाइनर उन्हें आपके कोड में एकीकृत करने से पहले कर रहे हैं। अभिविन्यास या आयाम में एक साधारण परिवर्तन भारी रूप से बदल सकता है (चुपचाप) उन पर कौन से ऑपरेशन numpy प्रदर्शन करता है।

+0

आप केवल 'ए' को अपडेट करना चाहते हैं जहां 'std (ए)> 0' शून्य से विभाजन से बचने के लिए और' NaN' मान –

+0

क्या यह संभव है जहां ए को सूचियों की सूची के रूप में दर्शाया गया हो? – Neamah

+0

@Neamah क्यों नहीं [कन्वर्ट] (http://stackoverflow.com/questions/10346336/list-of-lists-into-numpy-array) एक numpy सरणी में? – kingledion

3
from sklearn.preprocessing import StandardScaler 

standardized_data = StandardScaler().fit_transform(your_data) 

उदाहरण: अच्छी तरह से बड़े डेटा सेट पर

>>> 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]]) 

काम करता है।

+0

आप ctrl + k का उपयोग बैकटिक्स के बजाय सब कुछ इंडेंट करने के लिए कर सकते हैं। –

1

sklearn.preprocessing.scale का उपयोग करें।

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

यहाँ एक उदाहरण है।

>>> 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

संबंधित मुद्दे