我們之前介紹了幾種機器學習演算法,這些機器學習演算法都是用來進行分類的。今天換換口味,我們來了解一下如何進行回歸,回歸是基於已有的資料對新的資料進行**,比如**產品銷量。
我們來看看最簡單的線性回歸,基於標準的線性回歸,可以擴充套件出更多的線性回歸演算法,比如基於核函式的區域性加權線性回歸,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...