線性回歸的討論

2021-09-06 21:24:58 字數 3525 閱讀 8394

給定乙個資料集d=,所謂線性回歸就是模擬出乙個線性模型f(x

)=k∗

x+bf(x) = k * x + b

f(x)=k

∗x+b

,使得對所有的x∈

\in∈d得到f(x)

≈ y ∈

\in∈d,即盡可能準確的**真實的y值。

問題主要集中在我們該如何得到k、b的值呢?

關鍵在於如何度量f(x)與真實的y之間的差別,將誤差控制在最小。

首先便是loss(誤差)函式的設定與引入,不妨僅僅考慮樣本屬性的數目只有乙個(即x是標量)。我們使用均方誤差最小化(最小二乘法)的方法:

e (k

,b)=

arg(

k,b)

min∑

i=1n

(f(x

i)−y

i)2=

arg(

k,b)

min∑

i=1n

(yi−

k∗xi

−b)2

e_ = arg_ min\sum_^n(f(x_i) - y_i)^2=arg_ min\sum_^n(y_i - k * x_i- b )^2

e(k,b)

​=ar

g(k,

b)​m

ini=

1∑n​

(f(x

i​)−

yi​)

2=ar

g(k,

b)​m

ini=

1∑n​

(yi​

−k∗x

i​−b

)2這個式子有很好的幾何意義,代表著每個樣本點到擬合曲線的距離平方值最小。使得e(k

,b)e_

e(k,b)

​的值最小,就是所謂的引數估計。我們可以將e(k

,b)e_

e(k,b)

​分別對k和b分別求偏導數,令得到的式子為零。便可以得到k、b的最優解。

因為我們經常遇到的問題很大可能是多維的,因此將屬性值拓展為向量,則運算變為矩陣(矩陣x的最後一列是1):

e (k

^)=(

y−xk

^)t(

y−xk

^)e_)}= (y-x\hat) ^t(y-x\hat)

e(k^)​

=(y−

xk^)

t(y−

xk^)

k ^=

(k;b

)\hat = (k;b)

k^=(k;

b)之後我們將e(k

^)e_)}

e(k^)​

對k

^\hat

k^求偏導便得到了k

^\hat

k^的最優解類似於一元的情況。但是矩陣並不一定是滿秩的,即解不一定唯一,這時便要考慮到使用者的歸納偏好問題,留在以後討論。

有這樣乙個例子:

我們用numpy包生成一百個隨機的x值,並且設定y值與x有一定的線性關係(k=0.1,b=0.2),然後把這樣的線性關係繪製出來:

import tensorflow as tf

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

import pandas as pd

%matplotlib inline

# 使用numpy生成100個隨機點 樣本

x_data = np.random.rand(

100)

y_data = x_data *

0.1+

0.2fig, ax = plt.subplots(

)ax.scatter(x_data, y_data)

ax.set_xlabel(

'x')

ax.set_ylabel(

'y')

plt.show(

)

繪製出來的圖是這樣的:

之後我們用tensorflow(乙個深度學習框架)的內建api直接構造乙個線性回歸的模型(採用梯度下降的方法),進行**,設定迭代次數為201次,每當20的倍數時便將學習結果輸出、繪製出來,會發現我們最終得到的圖與原圖相似(即斜率基本一致,偏置值基本一致)。

# 構造乙個線性模型

b = tf.variable(

1.1)

k = tf.variable(

0.5)

y = k * x_data + b

# 二次代價函式

loss = tf.reduce_mean( tf.square(y_data - y)

)# 定義乙個梯度下降法來進行訓練的優化器

optimizer = tf.train.gradientdescentoptimizer(

0.2)

# 梯度下降 學習率是0.2

# 定義乙個最小化代價函式

train = optimizer.minimize(loss)

# 初始化變數

init = tf.global_variables_initializer(

)with tf.session(

)as sess:

sess.run(init)

for step in

range

(201

):

sess.run(train)

if step %

20==

0:

data1 = np.random.rand(

100)

data2 = data1 * sess.run(k)

+ sess.run(b)

fig, ax = plt.subplots(

) ax.scatter(data1,data2)

ax.set_xlabel(

'x')

ax.set_ylabel(

'y')

plt.show(

)print

(step, sess.run(

[k, b]

))

最終的圖如下:

且斜率值和偏置值分別問:[0.099538416, 0.20024595]。與初始的基本一致。

(**看不懂或不了解 tensorflow 沒關係,只要明白線性回歸就好了)

線性回歸模型 線性回歸模型

回歸的思想和分類有所不一樣,分類輸出的結果為離散的值,回歸輸出的是乙個連續型的值。線性回歸的思想就是試圖找到乙個多元的線性函式 當輸入一組特徵 也就是變數x 的時候,模型輸出乙個 值y h x 我們要求這個 值盡可能的準確,那麼怎麼樣才能做到盡可能準確呢?其中 表示實際值,表示 值 其中 表示實際值...

線性回歸(標準回歸)

今天我們來討論機器學習的另乙個領域 首先我們來討論利用線性回歸來 數值型資料。利用線性回歸進行 的過程就是求解回歸係數的過程,求出回歸係數後進行係數與特徵值乘積求和即可,這裡我們使用最小二乘法進行求解 ex0.txt 提取碼 dbe2 def loaddataset filename numfeat...

回歸學習 線性回歸

匯入資料 from sklearn.datasets import load boston boston load boston print boston.descr 資料分割 from sklearn.cross validation import train test split import ...