දත්ත 0-1 පරාසයට සාමාන්‍යකරණය කරන්නේ කෙසේද?


292

කරුණාකර මට මග පෙන්වීමට කිසිවෙකුට හැකිද?

මට අවම සහ උපරිම අගයන් ඇත, පිළිවෙලින් -23.89 සහ 7.54990767 කියන්න.

මට 5.6878 ක අගයක් ලැබෙන්නේ නම්, මෙම අගය 0 සිට 1 දක්වා පරිමාණයකින් පරිමාණය කරන්නේ කෙසේද?


9
මෙය මාර්ගයද = (අගය-මිනි) / (උපරිම-මිනි)
ඇන්ජලෝ

3
මෙම ත්‍රෙඩ් එක කියවීමට එය ඔබට උදව් වනු ඇත: බෙදා හැරීම-සත්‍යාපනය කරන්නේ කෙසේද-සාමාන්‍යකරණය කර ඇත. එය ඔබගේ ප්‍රශ්නයට පිළිතුරු සපයන්නේ නම්, ඔබට මෙම Q මකා දැමිය හැකිය; එසේ නොවේ නම්, ඔබට තවමත් නොතේරෙන දේ සඳහන් කිරීමට ඔබේ Q සංස්කරණය කරන්න.
gung - මොනිකා නැවත

1
ආරක්ෂාව පිළිබඳ පැහැදිලි කිරීම: මෙම ප්‍රශ්නය කේත විසඳුම් පමණක් අඩංගු අමතර පිළිතුරු ආකර්ෂණය කරයි. මේවා සමහර පා readers කයන්ට සිත්ගන්නාසුළු හෝ ප්‍රයෝජනවත් විය හැකි නමුත්, කේත විසඳුම්වල ගබඩාවන් සැපයීම CV හි අරමුණ නොවේ.
නික් කොක්ස්

1
සපයන ලද විසඳුම් රේඛීය පරස්පර අගයක් සලකා බලයි - ඔබ වෙනස් සාමාන්‍යකරණයකට කැමතිද, උදාහරණයක් ලෙස ප්‍රතිදානය සඳහා ඒකාකාරී සම්භාවිතාවක් ලබා ගන්නා එකක්ද?
meduz

Answers:


331

ඔබේ දත්ත සාමාන්‍යකරණය කිරීමට ඔබට අවශ්‍ය නම්, ඔබට යෝජනා කළ පරිදි එය කළ හැකි අතර පහත සඳහන් දේ සරලව ගණනය කරන්න:

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="")

13
illustrate the pointඔබේ (නිවැරදි) පිළිතුරට වඩා වෙනස් පෙනුමක් ඇති හිස්ටෝග්‍රැම් දෙක කරන්නේ කෙසේදැයි මම කල්පනා කරමි.
ttnphns

14
nttnphns ඒවා වෙනස් ලෙස පෙනෙන්නේ හිස්ටෝග්‍රැම් වල ද්විත්වය නිසාය. කෙසේ වෙතත් මගේ අදහස වූයේ මුල් අගයන් -100 ත් 100 ත් අතර වූ බවත් දැන් සාමාන්‍යකරණයෙන් පසු ඒවා 0 සහ 1 අතර ජීවත් වන බවත් පෙන්වීමයි.

21
Nttnphns විසින් කරන ලද මෘදු නාස්තිය යනු (සරල) අදහසක් නිදර්ශනය කිරීම සඳහා අඩු සංකීර්ණ මාධ්‍යයක් භාවිතා කිරීමට ඔබව දිරිමත් කිරීම පමණක් නොව (වඩාත් සෘජුවම අදාළ නිදර්ශනයක් මෙහි ප්‍රයෝජනවත් විය හැකි බවට ඉඟියක් ලෙස (මම සැක කරමි). ඔබ එය ඇත්තටම විශ්රාම වැටුප් සපයන MIN සහ MAX යෙදූ විට පරිවර්තනය ප්රස්තාරය කිරීමට වඩා පහසු ක්රමයක් සොයා යන දෙකෙන්ම කරන්න පුළුවන්
whuber

1
0-1 වෙනුවට අභිරුචි පරාසයට "සාමාන්‍යකරණය" කිරීමට ක්‍රමයක් තිබේද?
ජෝන් ඩෙමෙට්‍රියෝ

1
@ ජෝන් ඩෙමෙට්‍රියෝ පිරිසිදු විසඳුම නොවිය හැක, නමුත් ඔබට එය කිරීමට සාමාන්‍යකරණය කළ අගයන් පරිමාණය කළ හැකිය. ඔබට උදාහරණයක් ලෙස 0-100 පරාසය අවශ්‍ය නම්, ඔබ එක් එක් අංකය 100 න් ගුණ කරන්න. 10-100 වැනි 0 සමඟ ආරම්භ නොවන පරාසයක් ඔබට අවශ්‍ය නම්, ඔබ එය කරන්නේ MAX-MIN පරිමාණයෙන් සහ පසුව MIN එකතු කිරීමෙන් එයින් ඔබට ලැබෙන අගයන්. එබැවින් 90 කින් පරිමාණය කර 10 එකතු කරන්න. ඔබට අවශ්‍ය බොහෝ අභිරුචි පරාසයන් සඳහා එය ප්‍රමාණවත් විය යුතුය.
ඇලෙක්සැන්ඩර් රොසා

52

මිනි සහ උපරිම නව අත්තනෝමතික පරාසයකට මිනි ' සිට මැක්ස්' දක්වා ඇති දත්ත අගයන් රේඛීයව යථා තත්වයට පත් කිරීමේ සාමාන්‍ය එක්-පේළි සූත්‍රය වේ.

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

11
මෙය නිවැරදි නමුත් කාර්යක්ෂම නොවේ. එය රේඛීය පරිවර්තනයකි, එබැවින් ඔබ පූර්ව ගණනය කිරීම් aහා bනියතයන් සිදු කර පසුව අදාළ newvalue = a * value + bවේ. a = (max'-min')/(max-min)සහb = max - a * max
මාර්ක් ලකාටා

2
මෙය උපුටා දක්වන්නේ කෙසේදැයි ඔබ දන්නවාද? මම කිව්වේ, කොහේ හරි “මුල්” සඳහනක් තිබේද?
ට්‍රෙෆෙක්ස්

5
Ark මාක්ලකාටා සුළු (යතුරු ලියනය?) නිවැරදි කිරීම: b = max' - a * maxහෝb = min' - (a * min)
නික්

Ick නික් - ඔව්. මට අතුරුදහන් '
මාර්ක් ලකාටා

කරුණාකර ඔබේ සාමාන්‍යකරණය මෙහි සැසඳිය හැකිද? Se.mathworks.com/matlabcentral/answers/… එනම් සමීකරණය u = -1 + 2.*(u - min(u))./(max(u) - min(u));.
Léo Léopold Hertz 준영

14

සාමාන්‍යකරණය සඳහා මගේ 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
මම හිතන්නේ නැහැ, මේක තමයි එකම වෙනස කියලා. මගේ කේතයේ, සාමාන්‍යකරණය කිරීමට පෙර තිබූ අගයට සාමාන්‍යකරණය කළ අගයක් ආපසු ලබා දෙන්නේ කෙසේදැයි මම පෙන්වා දුන්නෙමි. මම හිතන්නේ, ඒකෙන් මේ පිළිතුර වටිනවා.
ජන්කල්

1
ඔබ කේතයක් පමණක් පළ කරන බව තවමත් සත්‍යයකි: විවරණයේ දී කේතයේ විශේෂ ගුණාංග යැයි ඔබ අවධාරණය කළ යුතු යැයි මම සිතමි, එසේ නොමැතිනම් පා readers කයන්ට ඒවා මොනවාදැයි බැලීමට කේතය කියවිය යුතුය. අනුමාන වශයෙන් පරිමාණය ප්‍රතිලෝම කිරීම ප්‍රයෝජනවත් වන්නේ (අ) මුල් අගයන් නැවත ලියන ලද විට පමණක් වන අතර (ආ) අවම හා උපරිමය සුරැකීමට පරිශීලකයා දූරදර්ශීව මතක තබා ඇත. ඉහත දක්වා ඇති පරිදි මගේ පුළුල් කරුණ නම්, සීවී කේත උදාහරණ වල ගබඩාවක් වීමට අරමුණු නොකරන බවයි.
නික් කොක්ස්

සමහර ගැටලු තිබේ, ඔබට වටිනාකම යථා තත්වයට පත් කිරීමට අවශ්‍ය නම්: උදාහරණයක් ලෙස ස්නායුක ජාල ... නමුත් ඔබ නිවැරදියි, දත්ත විශ්ලේෂණය කරන ආකාරයට මෙම පිළිතුර ඉතා නරක ය.
ජන්කල්

3
Ick නික්කොක්ස් ඔහුගේ පිළිතුර පිළිගත් පිළිතුරට වඩා සතුටුදායක බව මට පෙනී ගියේය.
කාල් මොරිසන්

5

ශුන්‍යයෙන් බෙදීම

මතක තබා ගත යුතු එක් දෙයක් නම් එය 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]

මෙය 0-1 පරාසයකට නොව එකතුව 1 ට නැවත ලබා ගැනීමකි. මම හිතන්නේ ඒ නිසා පිළිතුර මාතෘකාවෙන් බැහැරයි.
ttnphns

එහෙම නෑ. normalize([12, 20, 10])ප්‍රතිදානයන් [0.2, 1.0, 0.0], එය ඔබට ලැබෙනු ඇත (val - min) / (max - min).
රොඩ්රිගෝ-සිල්වෙයිරා

@ රොඩ්රිගෝ-සිල්වෙයිරා 0.25 සියල්ලම ප්‍රතිදානය කරන්නේ මන්දැයි මට නොපෙනේ. 0.5 ට වඩා හොඳ නැද්ද? සියලුම අයිතම සමාන බැවින් පරතරය කේන්ද්‍රගතව තබා ගත යුතුය.
javierdvalle

1

මේක උත්සාහ කරන්න. එය ශ්‍රිත පරිමාණයට අනුරූප වේ

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

8
මෙම පිළිතුර සහ දැනටමත් පිළිගත් පිළිතුර අතර වැදගත් වෙනසක් ඇත. එය ප්‍රධාන අදහස පැහැදිලිව හා සෘජුව පැහැදිලි කළ අතර දෙවනුව පොදුවේ භාවිතා කරන එක් වැඩසටහනක එය කරන්නේ කෙසේදැයි පෙන්වා දුන්නේය. අනෙක් අතට, ඔබ මෙහි පළ කරන්නේ කේතය පමණි. මෙම සංසදයේ මෙය හොඳ කේතයක් (සමහර පැහැදිලි කළ නොහැකි භාෂාවකින්) යැයි විශ්වාස කිරීමට ලැබීම ගැන මම සතුටු වන අතර, සාමාන්‍යයෙන් අපට සිතිය හැකි සෑම භාෂාවකින්ම එය කරන්නේ කෙසේද යන්න පැහැදිලි කරන සෑම ප්‍රශ්නයකටම පිළිතුරු මිටියක් නොමැත. එසේ නොමැතිනම් අපට මෙහි SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java යන පිළිතුරු ඇත. පයිතන් යනාදිය
නික් කොක්ස්

0

පිළිතුර හරි නමුත් මට යෝජනාවක් තිබේ, ඔබේ පුහුණු දත්ත යම් පරාසයකින් ඔබ්බට ගියහොත් කුමක් කළ යුතුද? ඔබට ස්කොෂිං තාක්ෂණය භාවිතා කළ හැකිය. කිසි විටෙකත් පරාසයෙන් පිටතට නොයන බවට සහතික වනු ඇත. මේ වෙනුවට

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මෙය භාවිතා කිරීමට මම නිර්දේශ කරමි

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මිනිත්තු සහ උපරිම පරාසය තුළ මේ ආකාරයට ස්කොෂ් කිරීම සමඟ

රූප විස්තරය මෙහි ඇතුළත් කරන්න

සහ අපේක්ෂිත පරාසයෙන් පිටත පරතරයේ ප්‍රමාණය පරාසය ඉක්මවා යන අගයන් ඇති බවට විශ්වාසයේ මට්ටමට කෙලින්ම සමානුපාතික වේ.

වැඩි විස්තර සඳහා ඔබට ගූගල් කළ හැකිය: පරාසයෙන් පිටත අංක වර්ග කිරීම සහ "ඩෝරියන් පයිල්" හි දත්ත සැකසීමේ පොත වෙත යොමු වන්න.


6
සාම්ප්‍රදායික ලෙස ප්‍රාග්ධනීකරණය භාවිතා කිරීමට කරුණාකර ඔබේ පිළිතුර සංස්කරණය කරන්න. නිරන්තර කුඩා අකුරු විනෝදජනක හෝ කාර්යක්ෂම බවක් පෙනෙන්නට තිබුණත්, සෑම කෙනෙකුටම පාහේ කියවීම වඩාත් අපහසු වේ.
නික් කොක්ස්

4
නිදර්ශන ඔබේ පිළිතුර ප්‍රමාණවත් ලෙස ඉදිරිපත් නොකරයි. “ස්කොෂිං තාක්ෂණය” යනු කුමක්ද?
whuber

0

පුස්තකාලය Pythonසාමාන්‍යකරණය කිරීම සඳහා මගේ ක්‍රියාත්මක කිරීම මෙන්න padas:

සාමාන්‍යකරණය:

normalized_df=(df-df.mean())/df.std()

අවම උපරිම සාමාන්‍යකරණය:

normalized_df=(df-df.min())/(df.max()-df.min())
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.