線性回歸演算法原理及實現

2021-08-18 06:20:32 字數 3185 閱讀 9489

我們之前介紹了幾種機器學習演算法,這些機器學習演算法都是用來進行分類的。今天換換口味,我們來了解一下如何進行回歸,回歸是基於已有的資料對新的資料進行**,比如**產品銷量。

我們來看看最簡單的線性回歸,基於標準的線性回歸,可以擴充套件出更多的線性回歸演算法,比如基於核函式的區域性加權線性回歸,lasso等。希望了解的可以查閱相關的資料。下面來看看最基本的線性回歸的原理。

這裡我們使用平方誤差來評估實際y值和**值之間的誤差:

修改為矩陣形式:

我們要使平方誤差為最小,根據微積分的內容,我們可以對上面的式子相對w求導:

令上式等於0,然後求得:

等式右邊都是我們的已知資料,所以可以求得w的最佳估計。

可以看到,線性回歸的原理比較簡單,但是,如果注意上面的式子會發現,我們需要求逆矩陣,但是如果矩陣不可逆怎麼辦?這裡有兩個思路,乙個是採用嶺回歸的思路,引入引數lambda:

這樣,按照線性代數的理論,對於lambda不為0,逆矩陣是一定存在的。下面看看**:

def linear_regression(x_arr, y_arr, lam=0.2):

x_mat = np.mat(x_arr).t

y_mat = np.mat(y_arr).t

x_tx = x_mat.t * x_mat

denom = x_tx + np.eye(np.shape(x_mat)[1]) * lam

# if lam == 0.0

if np.linalg.det(denom) == 0.0:

print('this matrix is singular, cannot do inverse')

return

ws = denom.i * (x_mat.t * y_mat)

return ws

再看一下呼叫的demo:

if __name__ == '__main__':

x_vals = np.linspace(0, 1, 1000)

y_vals = x_vals + np.random.normal(0, 1, 1000)

ws = linear_regression(x_vals, y_vals)

predict = 20 * ws

print(predict.a[0][0])

我們構造了x和y使其盡可能滿足x=y,不過在其中加入了標準正態分佈的雜訊,求出ws之後,我們**了x=20的y值。下面是我執行一次的結果,**效果還不錯:

19.690649736617942

另一種思路是我們直接使用梯度下降法求取平方誤差的最小值,這裡我們使用tensorflow實現。首先匯入需要的包並準備資料:

import numpy as np

import tensorflow as tf

learning_rate = 0.05

batch_size = 50

x_vals = np.linspace(0, 1, 1000)

y_vals = x_vals + np.random.normal(0, 1, 1000)

x_vals.resize((x_vals.shape[0], 1))

y_vals.resize((y_vals.shape[0], 1))

然後構造模型,x_data和y_target是佔位符,在訓練模型時傳入,w是我們訓練模型希望得到的目標變數:

sess = tf.session()

x_data = tf.placeholder(shape=[none, 1], dtype=tf.float32)

y_target = tf.placeholder(shape=[none, 1], dtype=tf.float32)

w = tf.variable(tf.random_normal([1, 1]))

model_output = tf.matmul(x_data, w)

定義均方誤差,然後使用梯度下降法進行優化,求取最小值

loss = tf.reduce_mean(tf.square(y_target - model_output))

init = tf.global_variables_initializer()

sess.run(init)

my_opt = tf.train.gradientdescentoptimizer(learning_rate)

train_step = my_opt.minimize(loss)

最後,使用隨機梯度下降法進行訓練,並輸出測試結果

for i in range(500):

rand_index = np.random.choice(len(x_vals), size=batch_size)

rand_x = x_vals[rand_index]

rand_y = y_vals[rand_index]

sess.run(train_step, feed_dict=)

[k] = sess.run(w)

predict = 20 * k

print(predict[0])

一次執行結果:

19.260855

至此,我們使用兩種方式實現了線性回歸,第一種方式比較直接,直接實現演算法,第二種方法借助於tensorflow通過梯度下降演算法求取了最優值。

線性回歸演算法 1 簡單線性回歸原理

一類機器學習演算法的思路 通過分析問題,找到問題的損失函式或者效用函式,通過最優化損失函式或者效用函式,確定機器學習的演算法模型 如圖所示,對於樣本,求一條擬合曲線 y ax b hat 為 的某個樣本 x 的 值,而 y 為樣本的真實值。我們希望 hat 和 y 的差距盡量小 y hat 2 此處...

線性回歸模型原理及推導

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

線性回歸及python實現

有資料集 x1 y1 x2 y2 xn yn x1 y 1 x2 y2 x n y n 其中,xi xi1 xi2 xi3 xid yi rx i x x x x y i in r xi x i1 xi2 xi3 xi d yi r,其中n表示變數的數量,d表示每個變數的維度。可以用以下函式來描述y...