0-1 रेंज में डेटा को सामान्य कैसे करें?


265

मैं सामान्य करने में खो गया हूं, क्या कोई मुझे मार्गदर्शन दे सकता है।

-23.89 और 7.54990767 क्रमशः मेरा न्यूनतम और अधिकतम मान है।

अगर मुझे 5.6878 का मान मिलता है तो मैं इस मान को 0 से 1 के पैमाने पर कैसे माप सकता हूं।


8
इस तरह से है = (मूल्य-मिनट) / (अधिकतम-मिनट)
एंजेलो

3
आपको इस सूत्र को पढ़ने में मदद मिल सकती है: कैसे-कैसे-सत्यापित-ए-वितरण-सामान्यीकृत है । यदि वह आपके प्रश्न का उत्तर देता है, तो आप इस प्रश्न को हटा सकते हैं; यदि नहीं, तो जो कुछ आप अभी भी नहीं समझते हैं, उसे निर्दिष्ट करने के लिए अपने क्यू को संपादित करें।
गंग

1
संरक्षण का स्पष्टीकरण: यह प्रश्न केवल कोड समाधान वाले अतिरिक्त उत्तरों को आकर्षित कर रहा है। हालांकि ये कुछ पाठकों के लिए दिलचस्प या उपयोगी हो सकते हैं, कोड समाधानों के रिपॉजिटरी प्रदान करना सीवी का उद्देश्य नहीं है।
निक कॉक्स

1
प्रदान किए गए समाधान एक रेखीय विपरीत मूल्य पर विचार करते हैं - क्या आप एक अलग सामान्यीकरण पसंद करेंगे, उदाहरण के लिए कि आउटपुट के लिए एक समान संभावना प्राप्त करें?
मेडुज

जवाबों:


299

यदि आप अपना डेटा सामान्य करना चाहते हैं, तो आप ऐसा कर सकते हैं जैसा कि आप सुझाव देते हैं और बस निम्नलिखित गणना करते हैं:

zi=ximin(x)max(x)min(x)

जहाँ और अब आपका सामान्यीकृत डेटा है। अवधारणा के प्रमाण के रूप में (हालांकि आपने इसके लिए नहीं पूछा था) इस बिंदु को स्पष्ट करने के लिए कुछ कोड और साथ में ग्राफ है:x=(x1,...,xn)ziithR

यहां छवि विवरण दर्ज करें

# Example Data
x = sample(-100:100, 50)

#Normalized Data
normalized = (x-min(x))/(max(x)-min(x))

# Histogram of example data and normalized data
par(mfrow=c(1,2))
hist(x,          breaks=10, xlab="Data",            col="lightblue", main="")
hist(normalized, breaks=10, xlab="Normalized Data", col="lightblue", main="")

11
मुझे केवल आश्चर्य है कि दो अलग-अलग दिखने वाले हिस्टोग्राम illustrate the pointआपके (सही) उत्तर कैसे देते हैं?
ttnphns

12
@ttnphns हिस्टोग्राम के द्विपक्ष के कारण वे केवल अलग दिखते हैं। हालाँकि मेरा कहना यह था कि मूल मान -100 से 100 के बीच रहते थे और अब सामान्य होने के बाद वे 0 और 1. के बीच रहते हैं। मैं इसे समझने के लिए एक अलग ग्राफ का उपयोग कर सकता था या मैं केवल सारांश आँकड़े दिखा सकता था।

20
@Ttnphns द्वारा कोमल कुहनी से आप न केवल एक (सरल) विचार को दर्शाने के कम जटिल साधनों का उपयोग करने के लिए प्रोत्साहित करने के लिए थे, बल्कि यह भी (मुझे संदेह है) एक संकेत के रूप में कि अधिक सीधे प्रासंगिक चित्रण यहाँ फायदेमंद हो सकता है। आप जब यह मिनट के लिए लागू किया जाता है और अधिकतम वास्तव में ओपी द्वारा आपूर्ति परिवर्तन ग्राफ़ बनाने के लिए एक और अधिक सरल तरीके का पता लगाकर दोनों कर सकता है
whuber

1
क्या 0-1 के बजाय कस्टम रेंज को "सामान्य" करने का कोई तरीका है?
जॉन डेमेट्रियौ

1
@JohnDemetriou सबसे साफ समाधान नहीं हो सकता है, लेकिन आप ऐसा करने के लिए सामान्यीकृत मानों को माप सकते हैं। यदि आप 0-100 की उदाहरण सीमा चाहते हैं, तो आप प्रत्येक संख्या को 100 से गुणा करेंगे। यदि आप चाहते हैं कि रेंज 0 से शुरू न हो, जैसे कि 10-100, तो आप इसे MAX-MIN द्वारा स्केल करके और फिर करेंगे आपके द्वारा प्राप्त मान केवल MIN जोड़ने से है। तो 90 से बड़े पैमाने पर, फिर 10. जोड़ें कि आप चाहते हैं कि कस्टम सीमा के अधिकांश के लिए पर्याप्त होना चाहिए।
अलेक्जेंडर रोसा

47

सामान्य रूप से रेखीय रूप से पुनर्विकसित डेटा मानों को न्यूनतम और अधिकतम रूप से एक नई मनमानी श्रेणी में ' अधिकतम' करने के लिए एक-सूत्र का सूत्र है

  newvalue= (max'-min')/(max-min)*(value-max)+max'
  or
  newvalue= (max'-min')/(max-min)*(value-min)+min'.

9
यह सही है, लेकिन कुशल नहीं है। यह एक रेखीय परिवर्तन है, इसलिए आप पूर्वगामी aऔर bस्थिर रहेंगे , और उसके बाद ही लागू होंगे newvalue = a * value + ba = (max'-min')/(max-min)औरb = max - a * max
मार्क लाकटा

1
क्या आप जानते हैं कि इसका हवाला कैसे दिया जाता है? मेरा मतलब है, कहीं एक "मूल" संदर्भ है?
ट्रेफेक्स

3
@MarkLakata थोड़ा (टाइपो?) सुधार: b = max' - a * maxयाb = min' - (a * min)
निक

@ निक - हाँ। मुझे
मार्क Lakata

क्या आप कृपया अपने सामान्यीकरण की तुलना यहाँ se.mathworks.com/matlabcentral/answers/… यानी समीकरण से कर सकते हैं u = -1 + 2.*(u - min(u))./(max(u) - min(u));
लेओ लेपोल्ड हर्ट्ज़ o

13

यहाँ सामान्यीकरण के लिए मेरा PHP कार्यान्वयन है:

function normalize($value, $min, $max) {
	$normalized = ($value - $min) / ($max - $min);
	return $normalized;
}

लेकिन जब मैं अपने स्वयं के कृत्रिम तंत्रिका नेटवर्क का निर्माण कर रहा था, तो मुझे ग्राफ़ के लिए अच्छा पठनीय आउटपुट प्राप्त करने के लिए सामान्यीकृत आउटपुट को मूल डेटा में बदलने की आवश्यकता थी।

function denormalize($normalized, $min, $max) {
	$denormalized = ($normalized * ($max - $min) + $min);
	return $denormalized;
}

$int = 12;
$max = 20;
$min = 10;

$normalized = normalize($int, $min, $max); // 0.2
$denormalized = denormalize($normalized, $min, $max); //12

निम्नांकित सूत्र का उपयोग करता है:

x(maxmin)+min


2
इस उत्तर और पहले से स्वीकार किए गए उत्तर के बीच एक महत्वपूर्ण अंतर है। यह मुख्य विचार को स्पष्ट और प्रत्यक्ष रूप से समझाता है और फिर दूसरा दिखाया गया है कि इसे आमतौर पर इस्तेमाल किए जाने वाले कार्यक्रम में कैसे किया जाता है। इसके विपरीत, आप यहाँ केवल कोड पोस्ट करते हैं। जबकि मुझे विश्वास है कि यह अच्छा कोड है (मैं PHP नहीं लिखता) इस मंच पर हम आम तौर पर हर प्रश्न के उत्तर का एक बंडल नहीं है जो यह समझाते हैं कि इसे हर बोधगम्य भाषा में कैसे किया जाए। अन्यथा हमारे यहाँ SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java में उत्तर होंगे। अजगर, आदि, आदि
निक कॉक्स

2
मुझे नहीं लगता, कि यह एकमात्र अंतर है। अपने कोड में, मैंने यह भी दिखाया कि सामान्यीकरण से पहले मूल्य को सामान्यीकृत मान कैसे लौटाया जाए। मुझे लगता है, कि यह इस जवाब के लायक बनाता है।
jankal

1
यह अभी भी सच है कि आप केवल कोड पोस्ट करते हैं: मुझे लगता है कि आपको कमेंट्री में कोड के किसी भी विशेष रूप से विशेष गुणों पर जोर देने की आवश्यकता है, अन्यथा पाठकों को यह देखने के लिए कोड पढ़ना होगा कि वे क्या हैं। संभवतया स्केलिंग का प्रयोग केवल तभी होता है जब (a) मूल मानों को अधिलेखित कर दिया गया हो लेकिन (b) उपयोगकर्ता ने विवेकपूर्ण रूप से न्यूनतम और अधिकतम को बचाने के लिए याद किया हो। जैसा कि ऊपर टिप्पणी की गई है, मेरा व्यापक बिंदु यह है कि सीवी कोड उदाहरणों का भंडार होने का लक्ष्य नहीं रखता है।
निक कॉक्स

कुछ समस्याएं हैं, जिनके लिए आपको मूल्य को पुनर्स्थापित करने की आवश्यकता है: उदाहरण के लिए Nueral Networks ... लेकिन आप सही हैं, डेटा विश्लेषण के तरीके से, यह उत्तर बहुत बुरा है।
jankal

3
@NickCox मैंने स्वीकार किए गए की तुलना में उसका उत्तर अधिक संतोषजनक पाया।
कार्ल मॉरिसन

4

शून्य से विभाजन

एक बात ध्यान रखें कि max - minयह शून्य के बराबर हो सकता है। इस स्थिति में, आप उस विभाजन को नहीं करना चाहेंगे।

ऐसा मामला जहां ऐसा होगा जब आप जिस सूची को सामान्य करने का प्रयास कर रहे हैं, सभी मान समान हैं। ऐसी सूची को सामान्य करने के लिए, प्रत्येक आइटम होगा 1 / length

// JavaScript
function normalize(list) {
   var minMax = list.reduce((acc, value) => {
      if (value < acc.min) {
         acc.min = value;
      }

      if (value > acc.max) {
         acc.max = value;
      }

      return acc;
   }, {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY});

   return list.map(value => {
      // Verify that you're not about to divide by zero
      if (minMax.max === minMax.min) {
         return 1 / list.length
      }

      var diff = minMax.max - minMax.min;
      return (value - minMax.min) / diff;
   });
}

उदाहरण:

normalize([3, 3, 3, 3]); // output => [0.25, 0.25, 0.25, 0.25]

यह एक अंक 1 के लिए है, 0-1 की सीमा तक नहीं। मुझे लगता है कि इसका उत्तर आंसर-की है।
tnnphns

ऐसा नहीं। normalize([12, 20, 10])आउटपुट [0.2, 1.0, 0.0], जो आप के साथ मिलेगा वही है (val - min) / (max - min)
रॉडरिगो-सिलवीरा

@ rodrigo-silveira मैं यह नहीं देखता कि सभी 0.25 आउटपुट क्यों हैं। यह सब 0.5 बेहतर नहीं है? सभी आइटम समान हैं, इसलिए अंतराल में केंद्रित रखा जाना चाहिए।
javierdvalle

0

उत्तर सही है, लेकिन मेरा एक सुझाव है, यदि आपके प्रशिक्षण डेटा में कुछ संख्या सीमा से बाहर हो तो क्या होगा? आप स्क्वाशिंग तकनीक का उपयोग कर सकते हैं। यह गारंटी दी जाएगी कि सीमा से बाहर कभी न जाएं। इसके बजाय

यहां छवि विवरण दर्ज करें

मैं इस का उपयोग करने की सलाह देता हूं

यहां छवि विवरण दर्ज करें

न्यूनतम और अधिकतम सीमा में इस तरह स्क्वाश करना

यहां छवि विवरण दर्ज करें

और अपेक्षित आउट-ऑफ-रेंज गैप का आकार सीधे विश्वास की डिग्री के लिए आनुपातिक है कि आउट-ऑफ-रेंज मान होंगे।

अधिक जानकारी के लिए आप Google: आउट-ऑफ-द-रेंज संख्याओं को स्क्वाश कर सकते हैं और "डोरियन पाइल" की डेटा तैयारी पुस्तक को संदर्भित कर सकते हैं


5
कृपया पारंपरिक के रूप में पूंजीकरण का उपयोग करने के लिए अपने उत्तर को संपादित करें। लगातार निचले मामले मनोरंजक या कुशल लग सकते हैं, लेकिन लगभग सभी को पढ़ना अधिक कठिन है।
निक कॉक्स

3
दृष्टांत आपके उत्तर को पर्याप्त रूप से व्यक्त नहीं करते हैं। वास्तव में एक "स्क्वाशिंग तकनीक" क्या है?
whuber

0

इसे इस्तेमाल करे। यह फ़ंक्शन स्केल के अनुरूप है

normalize <- function(x) { 
  x <- as.matrix(x)
  minAttr=apply(x, 2, min)
  maxAttr=apply(x, 2, max)
  x <- sweep(x, 2, minAttr, FUN="-") 
  x=sweep(x, 2,  maxAttr-minAttr, "/") 
  attr(x, 'normalized:min') = minAttr
  attr(x, 'normalized:max') = maxAttr
  return (x)
} 

7
इस उत्तर और पहले से स्वीकार किए गए उत्तर के बीच एक महत्वपूर्ण अंतर है। यह मुख्य विचार को स्पष्ट और प्रत्यक्ष रूप से समझाता है और फिर दूसरा दिखाया गया है कि इसे आमतौर पर इस्तेमाल किए जाने वाले कार्यक्रम में कैसे किया जाता है। इसके विपरीत, आप यहाँ केवल कोड पोस्ट करते हैं। जबकि मुझे यह विश्वास करते हुए खुशी हो रही है कि इस मंच पर यह अच्छा कोड (कुछ अस्पष्ट भाषा में) है, हमारे पास सामान्य रूप से हर प्रश्न का उत्तर देने का एक बंडल नहीं है जो यह बताता है कि इसे हर बोधगम्य भाषा में कैसे किया जाए। अन्यथा हमारे यहाँ SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java में उत्तर होंगे। अजगर, आदि, आदि
निक कॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.