題:
如何將數據標準化到0-1範圍?
Angelo
2013-09-23 20:18:57 UTC
view on stackexchange narkive permalink

我迷失了規範化,請問有人可以指導我。

我有一個最小值和最大值,分別是-23.89和7.54990767。

如果我有一個值5.6878如何將這個值縮放為0到1。

這是=(value-min)/(max-min)的方式嗎
它可以幫助您閱讀以下主題:[how-to-verify-a-distribution-is-normalized](http://stats.stackexchange.com/questions/70553/)。如果這樣可以回答您的問題,則可以刪除此問題;如果不是,請編輯您的Q以指定您仍然不了解的內容。
保護說明:這個問題吸引了僅包含代碼解決方案的額外答案。儘管這些對於某些讀者來說可能很有趣或有用,但是CV並不是提供代碼解決方案的存儲庫。
提供的解決方案考慮了*線性*對比值-您是否要進行另一種歸一化,例如獲得統一概率的輸出?
八 答案:
user25658
2013-09-23 21:03:28 UTC
view on stackexchange narkive permalink

如果要標準化數據,可以按照建議進行操作,只需計算以下內容即可:

$$ z_i = \ frac {x_i- \ min(x)} {\ max(x)-\ min(x)} $$ span>

其中 $ x =(x_1 ,. ..,x_n)$ span>和 $ z_i $ span>現在是您的 $ i ^ {th} $ 跨度>標準化數據。作為概念證明(儘管您並沒有要求),下面是一些 R 代碼和隨附的圖形來說明這一點:

enter image description here

 #示例Datax = sample(-100:100,50)#Normalized Datanormalized =(x-min(x))/(max(x)-min(x) )#示例數據和規範化數據的直方圖par(mfrow = c(1,2))hist(x,breaks = 10,xlab =“ Data”,col =“ lightblue”,main =“”)hist(規範化,breaks = 10,xlab =“標準化數據”,col =“ lightblue”,main =“”) 
我只想知道兩個看上去截然不同的直方圖如何“說明”(正確)答案的要點?
@ttnphns它們的區別僅在於直方圖的合併。但是,我的觀點是要表明原始值在-100到100之間,現在歸一化後它們在0和1之間。
@ttnphns的輕描淡寫的目的是鼓勵您不僅使用簡單的方法來說明(簡單的)想法,而且(我懷疑)是暗示在此使用更直接相關的說明可能會有所幫助。通過將變換應用於O.P實際提供的最小值和最大值,可以找到一種更簡單的方法來繪製變換圖,從而實現上述兩種目的。
還有其他功能可以在不使用max&min的情況下幫助標準化/縮放值嗎?
您能在這裡比較您的標準化嗎?https://se.mathworks.com/matlabcentral/answers/154075-how-to-scale-normalize-values-in-a-matrix-to-be-between-1-and-1
有沒有一種方法可以“標準化”自定義範圍而不是0-1?
@JohnDemetriou可能不是最乾淨的解決方案,但是您可以縮放歸一化的值來做到這一點。例如,如果您想要範圍為0-100,則只需將每個數字乘以100。如果您想要的範圍不是以0開頭(例如10-100),則可以通過按MAX-MIN縮放,然後縮放為只需加上MIN就可以從中獲得值。因此將其縮放90,然後添加10。對於您可能想要的大多數自定義範圍來說,這應該足夠了。
要在``numpy''中的多維數據上使用,請使用``normalized =(x-x.min())/(x.max()-x.min())''
該函數的名稱是什麼?我想了解一下這種方法。
如果最小值和最大值相等,會發生什麼?歸一化的結果是什麼?
ttnphns
2013-09-23 21:13:43 UTC
view on stackexchange narkive permalink

一般的單行公式,用於將已觀察到的 min max 的數據值線性重新縮放到新的任意範圍 min' max'

  newvalue =(max'-min')/(max-min)*(value-max)+ max'或newvalue =(max'-min ')/(最大-最小)*(值-最小)+最小'。 
這是正確的,但效率不高。這是一個線性變換,因此您將預先計算`a`和`b`常量,然後僅應用`newvalue = a * value + b`。 'a =(max'-min')/(max-min)`和`b = max-a * max`
你知道如何引用嗎?我的意思是,某處是否有“原始”參考?
@MarkLakata輕微(典型值)校正:`b = max'-a * max`或`b = min'-(a * min)`
@Nick-是的。我想念一個'
您能在這裡比較您的標準化嗎?https://se.mathworks.com/matlabcentral/answers/154075-how-to-scale-normalize-values-in-a-matrix-to-be-between-1-and-1即方程'u = -1 + 2。*(u-min(u))./(max(u)-min(u));`。
jankal
2015-05-27 13:22:58 UTC
view on stackexchange narkive permalink

這是我用於規範化的PHP實現:

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

但是當我構建自己的人工神經網絡時,我需要將規範化的輸出轉換回原始數據,以獲得圖形的良好可讀性輸出。

 函數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(\ text {max}-\ text {min})+ \ text {min} $

此答案與已接受的答案之間存在重要區別。這清楚,直接地解釋了主要思想,然後其次展示瞭如何在一個常用程序中做到這一點。相反,您僅在此處發布代碼。儘管我很高興在此論壇上認為這是不錯的代碼(我不寫PHP),但對於每個問題,通常都沒有一堆答案來解釋如何使用每種可能的語言來實現。否則,我們將在SAS,SPSS,Stata,MATLAB,C,C ++,C#,Java中得到答案。Python等
我不認為這是唯一的區別。在我的代碼中,我還展示瞭如何將歸一化的值返回到歸一化之前的值。我認為,這值得這個答案。
仍然只發布代碼是正確的:我認為您需要在註釋中強調代碼的任何所謂特殊之處,否則讀者必須閱讀代碼以查看其含義。假定僅當(a)原始值已被覆蓋,但(b)用戶謹慎記住要保存最小值和最大值時,才可以使用縮放比例反轉。如上所述,我的更廣泛的觀點是CV並非旨在成為代碼示例的存儲庫。
有一些問題,您需要在其中還原值: 例如神經網絡... 但是你是對的,以數據分析的方式,這個答案是非常糟糕的。
-1
@Karl Morrison您可以並且應該對此進行投票。但是在這裡,僅代碼答案嚴格地保持話題外。
rodrigo-silveira
2017-10-04 18:32:55 UTC
view on stackexchange narkive permalink

除以零

要記住的一件事是, max-min 可以等於零。在這種情況下,您不想執行該劃分。

這種情況將在您要規範化的列表中的所有值都相同時發生。為了規範化這樣的列表,每個項目應為 1 /長度

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

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

      返回acc;
   },{最小:Number.POSITIVE_INFINITY,最大:Number.NEGATIVE_INFINITY});

   返回list.map(value = > {
      //確認您不會被零除
      如果(minMax.max === minMax.min){
         返回1 / list.length
      }

      var diff = minMax.max-minMax.min;
      返回(值-minMax.min)/差異;
   });
}
 

示例:

  normalize([3,3,3,3]); //輸出= > [0.25、0.25、0.25、0.25]
 
這是重新縮放為總和1,而不是范圍0-1。因此,我只是認為答案是題外話。
不是這樣normalize([12,20,10])輸出`[0.2,1.0,0.0]`,這與使用(val-min)/(max-min)會得到相同。
@rodrigo-silveira我看不到為什麼全部0.25輸出。全部不是0.5更好嗎?所有項目均相等,因此應保持在間隔的中心。
如果變量是一個常數,則它既不會用作結果,也不會用作預測變量。無論哪種方式,您都不想對其進行標準化。我想這裡的主要信息是“當心試圖標準化每個可見變量,因為這種情況下您的代碼將給出令人困惑的結果,甚至失敗而沒有陷阱”,
前面的“將”應為“可能”。
Lui Kimman
2015-05-22 15:58:03 UTC
view on stackexchange narkive permalink

嘗試一下。它與函數 scale

 歸一化<-函數(x){x <- as.matrix(x)minAttr = apply(x,2,min )maxAttr = apply(x,2,max)x <-掃描(x,2,minAttr,FUN =“-”)x = sweep(x,2,maxAttr-minAttr,“ /”)attr(x,'歸一化:min')= minAttr attr(x,'normalized:max')= maxAttr return(x)}  
此答案與已接受的答案之間存在重要區別。這清楚,直接地解釋了主要思想,然後其次展示瞭如何在一個常用程序中進行操作。相反,您僅在此處發布代碼。儘管我很高興在此論壇上認為這是不錯的代碼(使用某些無法解釋的語言),但對於每個問題,我們通常都沒有一堆答案來解釋如何使用每種可能的語言來實現。否則,我們將在SAS,SPSS,Stata,MATLAB,C,C ++,C#,Java中得到答案。Python等
parvij
2013-09-25 17:00:02 UTC
view on stackexchange narkive permalink

答案是正確的,但我有一個建議,如果您的訓練數據遇到超出範圍的數字,您可以使用擠壓技術。它將保證永遠不會超出範圍。而不是這個

enter image description here

我建議使用此

enter image description here

,以最小和最大範圍

enter image description here

,並且預期範圍外間隙的大小與將存在範圍外值的置信度成正比。 / p>

有關更多信息,您可以穀歌:壓制超出範圍的數字,並參閱“ dorian pyle”的數據準備書

請編輯您的答案以使用大寫字母。一致的小寫字母可能看起來很有趣或有效,但是幾乎每個人都很難閱讀。
插圖無法充分傳達您的答案。什麼是“壓榨技術”?
Saeed
2020-03-18 15:36:47 UTC
view on stackexchange narkive permalink

這是我的 Python 實現,用於使用 padas 庫進行規範化:

Mean規範化:

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

Min-Max歸一化:

  normalized_df =(df-df.min())/(df.max()-df.min())
 
Yossi Levy
2020-05-16 11:59:46 UTC
view on stackexchange narkive permalink

選擇一個累積概率分佈F。然後,對於每個x,F(x)在0和1之間。

正確但不能回答問題。實際上,大多數經驗CDF方法都會將數據1、2、3、4、5映射為0.2(0.2)1或可能為0(0.2)0.8或僅可能為0.1(0.2)0.9,因此您很難理解為了證明這一點,甚至是對這個問題的一個傾斜的答案,在這個問題上應該達到極限0和1。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...