<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 如何轉換數據以更好地擬合正態分布 > 原文: [https://machinelearningmastery.com/how-to-transform-data-to-fit-the-normal-distribution/](https://machinelearningmastery.com/how-to-transform-data-to-fit-the-normal-distribution/) 統計領域的很大一部分涉及假設高斯分布的方法:熟悉的鐘形曲線。 如果您的數據具有高斯分布,則參數方法功能強大且易于理解。如果可能的話,這會激勵他們使用它們。即使您的數據沒有高斯分布。 您的數據可能看起來不是高斯數據或未通過常態測試,但可以進行轉換以使其適合高斯分布。如果您熟悉生成觀察的過程并且您認為它是高斯過程,或者除了一些失真之外,分布看起來幾乎是高斯分布,這種情況更有可能發生。 在本教程中,您將了解高斯分布可能失真的原因以及可用于使數據樣本更正常的技術。 完成本教程后,您將了解: * 如何考慮樣本的大小以及大數定律是否有助于改善樣本的分布。 * 如何識別和刪除分布中的極值和長尾。 * 功率變換和Box-Cox變換可用于控制二次或指數分布。 讓我們開始吧。 ![How to Transform Data to Better Fit The Normal Distribution](img/b9545db5d894cbdad7b6124c5f48e5c3.jpg) 如何將數據轉換為更好的擬合正態分布 照片由 [duncan_idaho_2007](https://www.flickr.com/photos/12844498@N06/4209167311/) ,保留一些權利。 ## 教程概述 本教程分為7個部分;他們是: 1. 高斯和高斯相似 2. 樣本量 3. 數據解析 4. 極端值 5. 長尾巴 6. 電力變革 7. 無論如何使用 ## 高斯和高斯相似 在某些情況下,您可能正在使用非高斯分布,但希望使用參數統計方法而不是非參數方法。 例如,您可能有一個具有熟悉鐘形的數據樣本,這意味著它看起來像高斯,但它無法進行一個或多個統計正態性測試。這表明數據可能是類似高斯的。在這種情況下,您更愿意使用參數統計,因為它具有更好的統計功效,并且因為數據顯然是高斯的,或者可能是在正確的數據轉換之后。 數據集在技術上可能不是高斯的原因有很多。在這篇文章中,我們將介紹一些簡單的技術,您可以使用這些技術將具有高斯分布的數據樣本轉換為高斯分布。 這個過程沒有靈丹妙藥;可能需要一些實驗和判斷。 ## 樣本量 數據樣本是非高斯的一個常見原因是因為數據樣本的大小太小。 在數據稀缺的情況下開發了許多統計方法。因此,最低限度。許多方法的樣本數量可能低至20或30個觀測值。 然而,考慮到數據中的噪聲,您可能看不到熟悉的鐘形或使用適度數量的樣本(例如50或100)的失敗正態性測試。如果是這種情況,也許您可??以收集更多數據。由于大數定律,您收集的數據越多,您的數據就越有可能用于描述潛在的人口分布。 為了使這個具體,下面是從高斯分布中抽取的50個觀測值的小樣本的圖的示例,其中平均值為100,標準偏差為50。 ```py # histogram plot of a small sample from numpy.random import seed from numpy.random import randn from matplotlib import pyplot # seed the random number generator seed(1) # generate a univariate data sample data = 50 * randn(50) + 100 # histogram pyplot.hist(data) pyplot.show() ``` 運行該示例會創建數據的直方圖,顯示沒有明確的高斯分布,甚至不是高斯分布。 ![Histogram Plot of Very Small Data Sample](img/18fe2a6095dd5076fc055a5197f030eb.jpg) 極小數據樣本的直方圖 將樣本的大小從50增加到100可以幫助更好地暴露數據分布的高斯形狀。 ```py # histogram plot of a small sample from numpy.random import seed from numpy.random import randn from matplotlib import pyplot # seed the random number generator seed(1) # generate a univariate data sample data = 50 * randn(100) + 100 # histogram pyplot.hist(data) pyplot.show() ``` 運行該示例,我們可以更好地看到將通過統計測試和眼球檢查的數據的高斯分布。 ![Histogram Plot of Larger Data Sample](img/120f37f17dd64adb088ee91fabb1288c.jpg) 大數據樣本的直方圖 ## 數據解析 也許您期望從數據中得到高斯分布,但無論您收集的樣本大小如何,它都不會實現。 這種情況的常見原因是您用于收集觀察結果的分辨率。數據的分布可能被所選擇的數據分辨率或觀察的保真度所模糊。在建模之前修改數據分辨率的原因可能有很多,例如: * 進行觀察的機制的配置。 * 數據正在通過質量控制過程。 * 用于存儲數據的數據庫的分辨率。 為了使這個具體,我們可以制作100個隨機高斯數的樣本,其均值為0,標準差為1,并刪除所有小數位。 ```py # histogram plot of a low res sample from numpy.random import seed from numpy.random import randn from matplotlib import pyplot # seed the random number generator seed(1) # generate a univariate data sample data = randn(100) # remove decimal component data = data.round(0) # histogram pyplot.hist(data) pyplot.show() ``` 運行該示例會產生一個看似離散的分布,盡管類似于高斯分布。將分辨率添加回觀察結果將導致更全面的數據分布。 ![Histogram Plot of a Low Resolution Data Sample](img/fe6b0e45099d7c21e29e5fd5b3f536e3.jpg) 低分辨率數據樣本的直方圖 ## 極端值 數據樣本可能具有高斯分布,但可能由于多種原因而失真。 一個常見的原因是在分布的邊緣存在極值。極端值可能存在的原因有很多,例如: * 測量誤差。 * 缺失數據。 * 數據損壞。 * 罕見的事件。 在這種情況下,可以識別和移除極值,以使分布更加高斯分布。這些極端值通常被稱為異常值。 這可能需要領域專業知識或與領域專家協商,以便設計識別異常值的標準,然后將其從數據樣本和您或您的模型希望將來使用的所有數據樣本中刪除。 我們可以證明極端值破壞數據分布是多么容易。 下面的示例創建了一個數據樣本,其中100個隨機高斯數字被縮放為平均值為10,標準差為5.然后,另外10個零值觀測值被添加到分布中。如果將缺失值或損壞值分配為零值,則會發生這種情況。這是公開可用的機器學習數據集中的常見行為;例如。 ```py # histogram plot of data with outliers from numpy.random import seed from numpy.random import randn from numpy import zeros from numpy import append from matplotlib import pyplot # seed the random number generator seed(1) # generate a univariate data sample data = 5 * randn(100) + 10 # add extreme values data = append(data, zeros(10)) # histogram pyplot.hist(data) pyplot.show() ``` 運行該示例將創建并繪制數據樣本。您可以清楚地看到零值觀測的意外高頻率如何破壞分布。 ![Histogram Plot of Data Sample With Extreme Values](img/637d387dec7f430c0bf8d979ee42fe2e.jpg) 具有極值的數據樣本的直方圖 ## 長尾巴 極端值可以以多種方式表現出來。除了分布邊緣的大量罕見事件之外,您可能會在一個或兩個方向上看到分布的長尾。 在圖中,這可以使分布看起來像是指數的,而實際上它可能是高斯的,在一個方向上有大量罕見事件。 您可以使用簡單的閾值(可能基于與平均值的標準偏差的數量)來識別和移除長尾值。 我們可以用一個人為的例子來證明這一點。數據樣本包含100個高斯隨機數,平均值為10,標準差為5.另外50個均勻隨機值在10到110的范圍內。這會在分布上產生長尾。 ```py # histogram plot of data with a long tail from numpy.random import seed from numpy.random import randn from numpy.random import rand from numpy import append from matplotlib import pyplot # seed the random number generator seed(1) # generate a univariate data sample data = 5 * randn(100) + 10 tail = 10 + (rand(50) * 100) # add long tail data = append(data, tail) # histogram pyplot.hist(data) pyplot.show() ``` 運行該示例,您可以看到長尾如何扭曲高斯分布并使其看起來幾乎呈指數或甚至雙峰(兩個凸起)。 ![Histogram Plot of Data Sample With Long Tail](img/72694c0674e3c10dbee3e05effa6a3c4.jpg) 長尾數據樣本的直方圖 我們可以在此數據集上使用一個簡單的閾值(例如值25)作為截止值,并刪除高于此閾值的所有觀測值。我們確實在事先了解數據樣本是如何設計的情況下選擇了此閾值,但您可以設想在自己的數據集上測試不同的閾值并評估其效果。 ```py # histogram plot of data with a long tail from numpy.random import seed from numpy.random import randn from numpy.random import rand from numpy import append from matplotlib import pyplot # seed the random number generator seed(1) # generate a univariate data sample data = 5 * randn(100) + 10 tail = 10 + (rand(10) * 100) # add long tail data = append(data, tail) # trim values data = [x for x in data if x < 25] # histogram pyplot.hist(data) pyplot.show() ``` 運行代碼顯示了長尾的這種簡單修整如何將數據返回到高斯分布。 ![Histogram Plot of Data Sample With a Truncated Long Tail](img/934b995c8354c6275fd1c67498fe40a2.jpg) 具有截斷長尾的數據樣本的直方圖 ## 電力變革 數據的分布可能是正常的,但數據可能需要轉換以幫助公開它。 例如,數據可能具有歪斜,這意味著鐘形的鐘可以以某種方式推動。在某些情況下,可以通過計算觀測值的平方根來轉換數據來糾正這種情況。 或者,分布可以是指數的,但如果通過取值的自然對數來轉換觀察值,則分布可能看起來正常。具有此分布的數據稱為log-normal。 為了使其具體化,下面是轉換為具有指數分布的高斯數的樣本的示例。 ```py # log-normal distribution from numpy.random import seed from numpy.random import randn from numpy import exp from matplotlib import pyplot # seed the random number generator seed(1) # generate two sets of univariate observations data = 5 * randn(100) + 50 # transform to be exponential data = exp(data) # histogram pyplot.hist(data) pyplot.show() ``` 運行該示例會創建一個顯示指數分布的直方圖。事實上,數據實際上并不正常。 ![Histogram of a Log Normal Distribution](img/ea452efa4c372ed3cbcc75890449872d.jpg) 對數正態分布的直方圖 取平方根和觀測值的對數以使分布正態屬于一類稱為冪變換的變換。 Box-Cox方法是一種數據變換方法,能夠執行一系列功率變換,包括日志和平方根。該方法以George Box和David Cox命名。 更重要的是,它可以配置為自動評估一組變換并選擇最佳擬合。它可以被認為是一種電子工具,可以消除數據樣本中基于功率的變化。得到的數據樣本可能更線性,并且將更好地表示潛在的非功率分布,包括高斯分布。 [boxcox()SciPy函數](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.boxcox.html)實現了Box-Cox方法。它需要一個名為lambda的參數來控制要執行的變換類型。 以下是lambda的一些常見值: * **lambda = -1** 。是一個互惠的變換。 * **lambda = -0.5** 是倒數平方根變換。 * **lambda = 0.0** 是對數變換。 * **lambda = 0.5** 是平方根變換。 * **lambda = 1.0** 沒有變換。 例如,因為我們知道數據是對數正態的,所以我們可以使用Box-Cox通過將lambda顯式設置為0來執行日志轉換。 ```py # power transform data = boxcox(data, 0) ``` 下面列出了對指數數據樣本應用Box-Cox變換的完整示例。 ```py # box-cox transform from numpy.random import seed from numpy.random import randn from numpy import exp from scipy.stats import boxcox from matplotlib import pyplot # seed the random number generator seed(1) # generate two sets of univariate observations data = 5 * randn(100) + 100 # transform to be exponential data = exp(data) # power transform data = boxcox(data, 0) # histogram pyplot.hist(data) pyplot.show() ``` 運行該示例對數據樣本執行Box-Cox變換并繪制結果,清楚地顯示高斯分布。 ![Histogram Plot of Box Cox Transformed Exponential Data Sample](img/646a6dc9c2988ff5b6f86579082f4584.jpg) Box Cox變換指數數據樣本的直方圖 Box-Cox變換的局限性在于它假設數據樣本中的所有值都是正數。 另一種不做出這種假設的方法是Yeo-Johnson變換。 ## 無論如何使用 最后,您可能希望將數據視為高斯數據,尤其是如果數據已經是高斯數據的話。 在某些情況下,例如使用參數統計方法,這可能會導致樂觀的發現。 在其他情況下,例如對輸入數據產生高斯期望的機器學習方法,您仍可能看到良好的結果。 只要您意識到可能的缺點,這是您可以做出的選擇。 ## 擴展 本節列出了一些擴展您可能希望探索的教程的想法。 * 列出高斯分布可能被扭曲的3種可能的其他方式 * 開發數據樣本并使用Box-Cox變換中的lambda的5個常用值進行實驗。 * 加載機器學習數據集,其中至少一個變量具有類似高斯的分布和實驗。 如果你探索任何這些擴展,我很想知道。 ## 進一步閱讀 如果您希望深入了解,本節將提供有關該主題的更多資源。 ### 帖子 * [如何使用Python進行時間序列預測數據的電源轉換](https://machinelearningmastery.com/power-transform-time-series-forecast-data-python/) ### API * [numpy.random.seed()API](https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.seed.html) * [numpy.random.randn()API](https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.randn.html) * [numpy.random.rand()API](https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.rand.html) * [matplotlib.pyplot.hist()API](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hist.html) * [scipy.stats.boxcox()API](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.boxcox.html) ### 用品 * [維基百科上的正態分布](https://en.wikipedia.org/wiki/Normal_distribution) * [維基百科上的異常值](https://en.wikipedia.org/wiki/Outlier) * 維基百科上的[對數正態分布](https://en.wikipedia.org/wiki/Log-normal_distribution) * [維基百科上的權力轉換](https://en.wikipedia.org/wiki/Power_transform) ## 摘要 在本教程中,您了解了高斯分布可能失真的原因以及可用于使數據樣本更正常的技術。 具體來說,你學到了: * 如何考慮樣本的大小以及大數定律是否有助于改善樣本的分布。 * 如何識別和刪除分布中的極值和長尾。 * 功率變換和Box-Cox變換可用于控制二次或指數分布。 你有任何問題嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看