<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之旅 廣告
                # 如何用Python從頭開始實現簡單線性回歸 > 原文: [https://machinelearningmastery.com/implement-simple-linear-regression-scratch-python/](https://machinelearningmastery.com/implement-simple-linear-regression-scratch-python/) 線性回歸是一種超過200年的預測方法。 [簡單線性回歸](http://machinelearningmastery.com/simple-linear-regression-tutorial-for-machine-learning/)是一個很好的第一個機器學習算法,因為它需要你從訓練數據集中估計屬性,但是對于初學者來說很簡單。 在本教程中,您將了解如何在Python中從頭開始實現簡單的線性回歸算法。 完成本教程后,您將了解: * 如何從訓練數據中估算統計量。 * 如何從數據中估計線性回歸系數。 * 如何使用線性回歸對新數據進行預測。 讓我們開始吧。 * **更新Aug / 2018** :經過測試和更新,可與Python 3.6配合使用。 * **2002年2月更新**:對保險數據集的預期默認RMSE進行小幅更新。 ![How To Implement Simple Linear Regression From Scratch With Python](img/8d21d8bbe9560bec279e6b57fc9cde68.jpg) 如何使用Python實現簡單的線性回歸 照片由 [Kamyar Adl](https://www.flickr.com/photos/kamshots/456696484/) ,保留一些權利。 ## 描述 本節分為兩部分,簡單線性回歸技術的描述和我們稍后將應用它的數據集的描述。 ### 簡單線性回歸 線性回歸假設輸入變量(X)和單個輸出變量(y)之間存在線性或直線關系。 更具體地,可以從輸入變量(X)的線性組合計算輸出(y)。當存在單個輸入變量時,該方法稱為簡單線性回歸。 在簡單線性回歸中,我們可以使用訓練數據的統計數據來估計模型所需的系數,以對新數據進行預測。 簡單線性回歸模型的行可以寫成: ```py y = b0 + b1 * x ``` 其中b0和b1是我們必須根據訓練數據估計的系數。 一旦系數已知,我們可以使用此公式來估計給定x的新輸入示例的y的輸出值。 它要求您根據數據計算統計特性,例如均值,方差和協方差。 我們已經處理了所有的代數,我們留下了一些算法來實現估計簡單的線性回歸系數。 簡而言之,我們可以估算系數如下: ```py B1 = sum((x(i) - mean(x)) * (y(i) - mean(y))) / sum( (x(i) - mean(x))^2 ) B0 = mean(y) - B1 * mean(x) ``` 其中i指的是輸入x或輸出y的第i個值。 如果現在還不清楚,請不要擔心,這些功能將在教程中實現。 ### 瑞典保險數據集 我們將使用真實數據集來演示簡單的線性回歸。 該數據集被稱為“瑞典汽車保險”數據集,并涉及根據索賠總數(x)預測數千瑞典克朗(y)中所有索賠的總付款額。 這意味著對于新的索賠(x),我們將能夠預測索賠的總支付額(y)。 以下是數據集前5個記錄的一小部分樣本。 ```py 108,392.5 19,46.2 13,15.7 124,422.2 40,119.4 ``` 使用零規則算法(預測平均值)預期的均方根誤差或RMSE約為81(千克朗)。 下面是整個數據集的散點圖。 ![Swedish Insurance Dataset](img/4f9b3ca41a4899476ef6d85f6edffa23.jpg) 瑞典保險數據集 您可以在 或 [](http://college.cengage.com/mathematics/brase/understandable_statistics/7e/students/datasets/slr/frames/slr06.html) 下載[的原始數據集。](https://www.math.muni.cz/~kolacek/docs/frvs/M7222/data/AutoInsurSweden.txt) 將其保存到本地工作目錄中的CSV文件,名稱為“ **insurance.csv** ”。 注意,您可能需要將歐洲“,”轉換為小數“。”。您還需要將文件從空格分隔的變量更改為CSV格式。 ## 教程 本教程分為五個部分: 1. 計算均值和方差。 2. 計算協方差。 3. 估算系數。 4. 作出預測。 5. 預測保險。 這些步驟將為您提供實現和訓練簡單線性回歸模型所需的基礎,以滿足您自己的預測問題。 ### 1.計算均值和方差 第一步是從訓練數據中估計輸入和輸出變量的均值和方差。 數字列表的平均值可以計算為: ```py mean(x) = sum(x) / count(x) ``` 下面是一個名為 **mean()**的函數,它為數字列表實現了這種行為。 ```py # Calculate the mean value of a list of numbers def mean(values): return sum(values) / float(len(values)) ``` 方差是每個值與平均值的總和平方差。 數字列表的差異可以計算為: ```py variance = sum( (x - mean(x))^2 ) ``` 下面是一個名為 **variance()**的函數,它計算數字列表的方差。它要求將列表的均值作為參數提供,這樣我們就不必多次計算它。 ```py # Calculate the variance of a list of numbers def variance(values, mean): return sum([(x-mean)**2 for x in values]) ``` 我們可以將這兩個函數放在一起,并在一個小的設計數據集上進行測試。 下面是x和y值的小數據集。 **注意**:如果將其保存到.CSV文件以與最終代碼示例一起使用,則從該數據中刪除列標題。 ```py x, y 1, 1 2, 3 4, 3 3, 2 5, 5 ``` 我們可以在散點圖上繪制此數據集,如下所示: ![Small Contrived Dataset For Simple Linear Regression](img/e644f57958bd1d11e6f2b3211166ea1c.jpg) 簡單線性回歸的小受控數據集 我們可以在下面的例子中計算x和y值的均值和方差。 ```py # Estimate Mean and Variance # Calculate the mean value of a list of numbers def mean(values): return sum(values) / float(len(values)) # Calculate the variance of a list of numbers def variance(values, mean): return sum([(x-mean)**2 for x in values]) # calculate mean and variance dataset = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]] x = [row[0] for row in dataset] y = [row[1] for row in dataset] mean_x, mean_y = mean(x), mean(y) var_x, var_y = variance(x, mean_x), variance(y, mean_y) print('x stats: mean=%.3f variance=%.3f' % (mean_x, var_x)) print('y stats: mean=%.3f variance=%.3f' % (mean_y, var_y)) ``` 運行此示例會打印出兩列的均值和方差。 ```py x stats: mean=3.000 variance=10.000 y stats: mean=2.800 variance=8.800 ``` 這是我們的第一步,接下來我們需要將這些值用于計算協方差。 ### 2.計算協方差 兩組數字的協方差描述了這些數字如何一起變化。 協方差是相關性的推廣。相關性描述了兩組數字之間的關系,而協方差可以描述兩組或更多組數字之間的關系。 另外,可以對協方差進行歸一化以產生相關值。 不過,我們可以計算兩個變量之間的協方差如下: ```py covariance = sum((x(i) - mean(x)) * (y(i) - mean(y))) ``` 下面是一個名為 **covariance()**的函數,它實現了這個統計量。它建立在前一步驟的基礎上,并將x和y值的列表以及這些值的平均值作為參數。 ```py # Calculate covariance between x and y def covariance(x, mean_x, y, mean_y): covar = 0.0 for i in range(len(x)): covar += (x[i] - mean_x) * (y[i] - mean_y) return covar ``` 我們可以在與前一節相同的小型設計數據集上測試協方差的計算。 總而言之,我們得到以下示例。 ```py # Calculate Covariance # Calculate the mean value of a list of numbers def mean(values): return sum(values) / float(len(values)) # Calculate covariance between x and y def covariance(x, mean_x, y, mean_y): covar = 0.0 for i in range(len(x)): covar += (x[i] - mean_x) * (y[i] - mean_y) return covar # calculate covariance dataset = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]] x = [row[0] for row in dataset] y = [row[1] for row in dataset] mean_x, mean_y = mean(x), mean(y) covar = covariance(x, mean_x, y, mean_y) print('Covariance: %.3f' % (covar)) ``` 運行此示例將打印x和y變量的協方差。 ```py Covariance: 8.000 ``` 我們現在已經準備好所有部件來計算模型的系數。 ### 3.估算系數 我們必須在簡單線性回歸中估計兩個系數的值。 第一個是B1,可以估算為: ```py B1 = sum((x(i) - mean(x)) * (y(i) - mean(y))) / sum( (x(i) - mean(x))^2 ) ``` 我們已經學到了上面的一些東西,可以簡化這個算法: ```py B1 = covariance(x, y) / variance(x) ``` 我們已經有了計算**協方差()**和**方差()**的函數。 接下來,我們需要估計B0的值,也稱為截距,因為它控制與y軸相交的直線的起點。 ```py B0 = mean(y) - B1 * mean(x) ``` 同樣,我們知道如何估計B1,我們有一個函數來估計 **mean()**。 我們可以將所有這些放在一個名為 **coefficients()**的函數中,該函數將數據集作為參數并返回系數。 ```py # Calculate coefficients def coefficients(dataset): x = [row[0] for row in dataset] y = [row[1] for row in dataset] x_mean, y_mean = mean(x), mean(y) b1 = covariance(x, x_mean, y, y_mean) / variance(x, x_mean) b0 = y_mean - b1 * x_mean return [b0, b1] ``` 我們可以將它與前兩個步驟中的所有函數放在一起,并測試系數的計算。 ```py # Calculate Coefficients # Calculate the mean value of a list of numbers def mean(values): return sum(values) / float(len(values)) # Calculate covariance between x and y def covariance(x, mean_x, y, mean_y): covar = 0.0 for i in range(len(x)): covar += (x[i] - mean_x) * (y[i] - mean_y) return covar # Calculate the variance of a list of numbers def variance(values, mean): return sum([(x-mean)**2 for x in values]) # Calculate coefficients def coefficients(dataset): x = [row[0] for row in dataset] y = [row[1] for row in dataset] x_mean, y_mean = mean(x), mean(y) b1 = covariance(x, x_mean, y, y_mean) / variance(x, x_mean) b0 = y_mean - b1 * x_mean return [b0, b1] # calculate coefficients dataset = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]] b0, b1 = coefficients(dataset) print('Coefficients: B0=%.3f, B1=%.3f' % (b0, b1)) ``` 運行此示例計算并打印系數。 ```py Coefficients: B0=0.400, B1=0.800 ``` 現在我們知道如何估計系數,下一步就是使用它們。 ### 4.做出預測 簡單線性回歸模型是由訓練數據估計的系數定義的線。 一旦估計了系數,我們就可以使用它們進行預測。 使用簡單線性回歸模型進行預測的等式如下: ```py y = b0 + b1 * x ``` 下面是一個名為 **simple_linear_regression()**的函數,它實現預測方程以對測試數據集進行預測。它還將來自上述步驟的訓練數據的系數估計聯系在一起。 從訓練數據準備的系數用于對測試數據進行預測,然后返回。 ```py def simple_linear_regression(train, test): predictions = list() b0, b1 = coefficients(train) for row in test: yhat = b0 + b1 * row[0] predictions.append(yhat) return predictions ``` 讓我們將我們學到的所有內容匯集在一起??,并為我們簡單的人為數據集做出預測。 作為此示例的一部分,我們還將添加一個函數來管理名為 **evaluate_algorithm()**的預測評估,并添加另一個函數來估計名為 **rmse_metric()的預測的均方根誤差**。 下面列出了完整的示例。 ```py # Standalone simple linear regression example from math import sqrt # Calculate root mean squared error def rmse_metric(actual, predicted): sum_error = 0.0 for i in range(len(actual)): prediction_error = predicted[i] - actual[i] sum_error += (prediction_error ** 2) mean_error = sum_error / float(len(actual)) return sqrt(mean_error) # Evaluate regression algorithm on training dataset def evaluate_algorithm(dataset, algorithm): test_set = list() for row in dataset: row_copy = list(row) row_copy[-1] = None test_set.append(row_copy) predicted = algorithm(dataset, test_set) print(predicted) actual = [row[-1] for row in dataset] rmse = rmse_metric(actual, predicted) return rmse # Calculate the mean value of a list of numbers def mean(values): return sum(values) / float(len(values)) # Calculate covariance between x and y def covariance(x, mean_x, y, mean_y): covar = 0.0 for i in range(len(x)): covar += (x[i] - mean_x) * (y[i] - mean_y) return covar # Calculate the variance of a list of numbers def variance(values, mean): return sum([(x-mean)**2 for x in values]) # Calculate coefficients def coefficients(dataset): x = [row[0] for row in dataset] y = [row[1] for row in dataset] x_mean, y_mean = mean(x), mean(y) b1 = covariance(x, x_mean, y, y_mean) / variance(x, x_mean) b0 = y_mean - b1 * x_mean return [b0, b1] # Simple linear regression algorithm def simple_linear_regression(train, test): predictions = list() b0, b1 = coefficients(train) for row in test: yhat = b0 + b1 * row[0] predictions.append(yhat) return predictions # Test simple linear regression dataset = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]] rmse = evaluate_algorithm(dataset, simple_linear_regression) print('RMSE: %.3f' % (rmse)) ``` 運行此示例將顯示以下輸出,該輸出首先列出這些預測的預測和RMSE。 ```py [1.1999999999999995, 1.9999999999999996, 3.5999999999999996, 2.8, 4.3999999999999995] RMSE: 0.693 ``` 最后,我們可以將預測繪制為一條線并將其與原始數據集進行比較。 ![Predictions For Small Contrived Dataset For Simple Linear Regression](img/62e745ccf1b6c3e4984f001c59e3e90f.jpg) 簡單線性回歸的小參數數據集預測 ### 5.預測保險 我們現在知道如何實現簡單的線性回歸模型。 我們將它應用于瑞典保險數據集。 本節假定您已將數據集下載到文件 **insurance.csv** ,并且它在當前工作目錄中可用。 我們將為前面步驟中的簡單線性回歸添加一些便利函數。 特別是加載稱為 **load_csv()**的CSV文件的函數,該函數將加載的數據集轉換為稱為 **str_column_to_float()**的數字,這是一個使用訓練和測試來評估算法的函數設置調用 **train_test_split()**一個函數來計算稱為 **rmse_metric()**的RMSE和一個函數來評估一個叫做 **evaluate_algorithm()**的算法。 下面列出了完整的示例。 使用60%數據的訓練數據集來準備模型,并對剩余的40%進行預測。 ```py # Simple Linear Regression on the Swedish Insurance Dataset from random import seed from random import randrange from csv import reader from math import sqrt # Load a CSV file def load_csv(filename): dataset = list() with open(filename, 'r') as file: csv_reader = reader(file) for row in csv_reader: if not row: continue dataset.append(row) return dataset # Convert string column to float def str_column_to_float(dataset, column): for row in dataset: row[column] = float(row[column].strip()) # Split a dataset into a train and test set def train_test_split(dataset, split): train = list() train_size = split * len(dataset) dataset_copy = list(dataset) while len(train) < train_size: index = randrange(len(dataset_copy)) train.append(dataset_copy.pop(index)) return train, dataset_copy # Calculate root mean squared error def rmse_metric(actual, predicted): sum_error = 0.0 for i in range(len(actual)): prediction_error = predicted[i] - actual[i] sum_error += (prediction_error ** 2) mean_error = sum_error / float(len(actual)) return sqrt(mean_error) # Evaluate an algorithm using a train/test split def evaluate_algorithm(dataset, algorithm, split, *args): train, test = train_test_split(dataset, split) test_set = list() for row in test: row_copy = list(row) row_copy[-1] = None test_set.append(row_copy) predicted = algorithm(train, test_set, *args) actual = [row[-1] for row in test] rmse = rmse_metric(actual, predicted) return rmse # Calculate the mean value of a list of numbers def mean(values): return sum(values) / float(len(values)) # Calculate covariance between x and y def covariance(x, mean_x, y, mean_y): covar = 0.0 for i in range(len(x)): covar += (x[i] - mean_x) * (y[i] - mean_y) return covar # Calculate the variance of a list of numbers def variance(values, mean): return sum([(x-mean)**2 for x in values]) # Calculate coefficients def coefficients(dataset): x = [row[0] for row in dataset] y = [row[1] for row in dataset] x_mean, y_mean = mean(x), mean(y) b1 = covariance(x, x_mean, y, y_mean) / variance(x, x_mean) b0 = y_mean - b1 * x_mean return [b0, b1] # Simple linear regression algorithm def simple_linear_regression(train, test): predictions = list() b0, b1 = coefficients(train) for row in test: yhat = b0 + b1 * row[0] predictions.append(yhat) return predictions # Simple linear regression on insurance dataset seed(1) # load and prepare data filename = 'insurance.csv' dataset = load_csv(filename) for i in range(len(dataset[0])): str_column_to_float(dataset, i) # evaluate algorithm split = 0.6 rmse = evaluate_algorithm(dataset, simple_linear_regression, split) print('RMSE: %.3f' % (rmse)) ``` 運行算法會在訓練數據集上打印訓練模型的RMSE。 獲得了大約33(千克朗)的分數,這比在相同問題上實現大約81(數千克朗)的零規則算法好得多。 ```py RMSE: 33.630 ``` ## 擴展 本教程的最佳擴展是在更多問題上嘗試該算法。 只有輸入(x)和輸出(y)列的小數據集很受歡迎,可用于統計書籍和課程的演示。其中許多數據集都可在線獲取。 尋找更多小型數據集并使用簡單的線性回歸進行預測。 **您是否將簡單線性回歸應用于其他數據集?** 在下面的評論中分享您的經驗。 ## 評論 在本教程中,您了解了如何在Python中從頭開始實現簡單的線性回歸算法。 具體來說,你學到了: * 如何從訓練數據集中估計統計量,如均值,方差和協方差。 * 如何估計模型系數并使用它們進行預測。 * 如何使用簡單線性回歸對真實數據集進行預測。 **你有什么問題嗎?** 在下面的評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看