一次線性回歸分析詳解及推導

2022-04-19 07:45:06 字數 4251 閱讀 2161

我們需要根據乙個人的工作年限來**他的薪酬(我們假設乙個人的薪酬只要工作年限有關係)。

首先引入必要的類庫,並且獲得trainning data。

import tensorflow as tf

import pandas as pd

import numpy as np

unrate = pd.read_csv('sd.csv')

print(unrate)

year  salary

0 1.0 39451

1 1.2 46313

2 1.4 37839

3 1.9 43633

4 2.1 39999

.. ... ...

85 12.0 106247

86 12.5 117634

87 12.6 113300

88 13.3 123056

89 13.5 122537

[90 rows x 2 columns]

接著,我們用matplotlib繪製出工作年限和薪酬之間的關係的點狀圖,方便我們更加直觀的感受他們之間的關係。

根據上圖的關係,我們可以看到:他們基本上還是成正相關的。考慮到只有一維資料,我們假定存在乙個函式,可以描述工作年限和薪酬之間的關係。我們假定該函式為:$$ \hat = wx+b $$

$ \hat $即為我們根據模型**出來的數值。 $ \hat(y) $ 和實際數值y 之間的距離,即為我們**的偏差值。即:$$ loss = \sum_^ (y_i- \hat y_i)^2$$

我們先隨機的挑選w 和b ,並且計算一下loss。同時繪製出來**的數值與原來的數值。

我們可以看到差距還是比較大的。

那麼該怎麼求w和b呢?

而我們工作的本質上就在尋找合適的w和b,從而達到loss最小。也就是找 $ loss = \sum_^ (y_i- \hat y_i)^2$的最小值。

單純的從數學上來看。尋找乙個函式的極值,就是找到它導數為0的駐點,然後去判斷哪些駐點為最小值。

我們把 $ \hat(y)$的計算公式帶入 loss中,我們得到

\[loss = \sum_^ (y_i-wx-b)^2

\]我們對這個函式求導函式得到

\[\frac=\frac}*\frac}

\]\[\frac=-2\sum_^((y_i-\hat_i)*\frac}) = -2\sum_^((y_i-\hat_i)x_i)

\]\[\frac = -2\sum_^(\frac_i}* \frac_i})=-2\sum_^(y_i-\hat_i)

\]如果直接這樣解方程,求出最小值,當然也可以,但是通用性不夠。所以用了另外一種方式:叫做梯度下降的方式去求解。

關於梯度下降,我後面再進行**和學習,現在只是簡單的理解其中的含義。

簡單的理解,就是在乙個凸函式中,隨機的選擇乙個點,然後算出這個點的斜率,然後讓這個點減去斜率*乙個速率,然後這個點就會向著最低點移動,直到到達最低點的時候,斜率=0,所以便不再變化。這樣的話,我們得到乙個通用的辦法,就不用解方程了,任何函式,只要我們得到他的導函式,然後隨機乙個點,重複梯度下降的步驟,就可以得到最合適的數值。

def train(w, b):

learning_rate = 0.0001

dw = np.sum((np.power(unrate['year'],2)* w -np.transpose(unrate['salary']-b)*unrate['year']))

db = np.sum(unrate['salary']-(unrate['year']*w-b))

temp_w = w - learning_rate * dw

temp_b = b - learning_rate * db

w = temp_w

b = temp_b

return w, b

我們先來train一次,看看效果

w,b = train(w,b)
y_pred = (unrate['year']*w + b)

loss = np.power((unrate['year']*w + b)-unrate['salary'],2).sum()

plt.scatter(unrate['year'],unrate['salary'])

plt.plot(unrate['year'],y_pred)

plt.show()

print(w)

print(b)

print(loss)

[5430.27093385]

[-755.1422668]

246914588144.68262

看到有明顯的效果,我們來多嘗試幾次試試

我們可以看到已經擬合出來一條直線,基本擬合了訓練的資料,這個時候,給定乙個x值,我們都可以**乙個\(\hat\)

x = 20

y_hat = w*x+b

print(y_hat)

[250902.4109859]
但是從圖中,我們可以看出來,擬合出來的直線,很明顯不能非常完美的貼合所有的資料。可能這些資料的分布,不是呈簡單線性相關。有可能是乙個曲線或者拋物線的形式。隨後,我講嘗試進行多元的擬合。

一次線性回歸擬合 二次線性回歸擬合

器學習一次回歸和二次回歸 reshape 行,列 可以根據指定的數值將資料轉換為特定的行數和列數 reshape 1,1 之後,資料集變成了一列 採用線性回歸方程 lr linearregression lr.fit x,y from sklearn.linear model import line...

線性回歸模型原理及推導

今天我們來看乙個最常見的機器學習模型 線性回歸 linear regression 模型。先舉個例子讓你明白什麼是線性回歸。現在我們有房屋面積和 的一些資料,如下圖 現在我們想知道的是,如果給乙個新的房屋面積130m 能否根據已知的資料來 新的面積對應的 是多少呢?這時,線性回歸模型就派上用場了。我...

python一元一次線性回歸

本文 給出 一元一次線性回歸的 實現 下篇文章會給出機器學習中提到的最小二乘法求線性回歸 這個線性回歸我是假設樓層與房價是線性回歸舉得列子,資料是隨便寫的,required packages import matplotlib.pyplot as plt import numpy as np imp...