1. 程式人生 > >機器學習之一元線性迴歸

機器學習之一元線性迴歸

概述

線性迴歸是利用數理統計中迴歸分析,來確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法,運用十分廣泛。其表達形式為y = w'x+e,e為誤差服從均值為0的正態分佈。
迴歸分析中,只包括一個自變數和一個因變數,且二者的關係可用一條直線近似表示,這種迴歸分析稱為一元線性迴歸分析。
如果迴歸分析中包括兩個或兩個以上的自變數,且因變數和自變數之間是線性關係,則稱為多元線性迴歸分析。

線性迴歸的目的

1、用於“預測”目標值。比如根據工資預測可貸款額度,根據商場人流預測銷售額,根據河流水深預測降雨量等。
2、用於變數“分析”。比如喝可樂對於體重的影響,汽車速度對於油耗的影響等。

一元線性迴歸

定義

迴歸分析只涉及到兩個變數的,稱一元迴歸分析。一元迴歸的主要任務是從兩個相關變數中的一個變數去估計另一個變數,被估計的變數,稱因變數,可設為Y;估計出的變數,稱自變數,設為X。迴歸分析就是要找出一個數學模型Y=f(X),使得從X估計Y可以用一個函式式去計算。當Y=f(X)的形式是一個直線方程時,稱為一元線性迴歸。這個方程一般可表示為Y=A+BX。根據最小平方法或其他方法,可以從樣本資料確定常數項A與迴歸係數B的值。A、B確定後,有一個X的觀測值,就可得到一個Y的估計值。迴歸方程是否可靠,估計的誤差有多大,都還應經過顯著性檢驗和誤差計算。有無顯著的相關關係以及樣本的大小等等,是影響迴歸方程可靠性的因素。

例項講解

背景

王經理是一家汽車銷售公司的銷售負責人,他深知投放網際網路視訊廣告對於銷售收入有提振作用,經過一年的實踐,得到了2017年每個月的廣告投入和銷售額的資料。資料如下表所示:

月份 廣告投入(萬) 銷售額(萬)
1 20 659
2 22 867
3 19 630
4 25 940
5 18 600
6 27 1000
7 30 1170
8 15 590
9 33 1280
10 38 1390
11 29 1080
12 40 1500
import matplotlib.pyplot as plt
x=[20,22,19,25,18,27,30,15,33,38,22,40]
y=[659,867,630,940,600,1000,1170,590,1280,1390,1080,1500]
# plt.plot(x,y)#畫連線圖
plt.scatter(x,y)#畫散點圖
plt.show()

png

from __future__ import print_function, division
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#原始資料
x_data=np.array([20,22,19,25,18,27,30,15,33,38,22,40])
y_data=np.array([659,867,630,940,600,1000,1170,590,1280,1390,1080,1500])
# 學習率
learning_rate = 0.5
# 迭代次數
training_epochs = 1000
# 定義運算時的佔位符
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
# 定義模型引數
W = tf.Variable(np.random.randn(), name="weight", dtype=tf.float32)
b = tf.Variable(np.random.randn(), name="bias", dtype=tf.float32)
# 定義模型
pred = tf.add(tf.multiply(W, X), b)
# 定義損失函式
cost = tf.reduce_min(tf.pow(pred-Y, 2)/(2*100))
# 使用Adam演算法
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
# 初始化所有變數
init = tf.global_variables_initializer()
# 訓練開始
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(training_epochs):
        for (x, y) in zip(x_data, y_data):
            sess.run(optimizer, feed_dict={X: x, Y: y})
        if (epoch + 1) % 50 == 0:#每50步輸出一次結果
            c = sess.run(cost, feed_dict={X: x_data, Y: y_data})
            print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.3f}".format(c), "W=", sess.run(W), "b=", sess.run(b))
    print("Optimization Finished!")
    training_cost = sess.run(cost, feed_dict={X: x_data, Y: y_data})
    print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')

    # 使用matplot繪圖
    plt.plot(x_data, y_data, 'ro', label="Original data")
    plt.plot(x_data, sess.run(W) * x_data + sess.run(b), label="Fitted line")
    plt.legend()
    plt.show()
Epoch: 0050 cost= 0.003 W= 36.60496 b= 36.615093
Epoch: 0100 cost= 0.066 W= 36.804733 b= 31.451597
Epoch: 0150 cost= 0.223 W= 37.028324 b= 25.547626
Epoch: 0200 cost= 0.456 W= 37.24408 b= 19.784721
Epoch: 0250 cost= 0.552 W= 37.4337 b= 14.668744
Epoch: 0300 cost= 0.516 W= 37.590607 b= 10.394382
Epoch: 0350 cost= 0.485 W= 37.715668 b= 6.9576025
Epoch: 0400 cost= 0.460 W= 37.81316 b= 4.2589083
Epoch: 0450 cost= 0.439 W= 37.888195 b= 2.1701117
Epoch: 0500 cost= 0.424 W= 37.945534 b= 0.56729364
Epoch: 0550 cost= 0.412 W= 37.989162 b= -0.6561921
Epoch: 0600 cost= 0.402 W= 38.022297 b= -1.5871764
Epoch: 0650 cost= 0.395 W= 38.047413 b= -2.2941654
Epoch: 0700 cost= 0.390 W= 38.066437 b= -2.830456
Epoch: 0750 cost= 0.386 W= 38.080845 b= -3.2369432
Epoch: 0800 cost= 0.383 W= 38.09176 b= -3.544872
Epoch: 0850 cost= 0.380 W= 38.100018 b= -3.7780528
Epoch: 0900 cost= 0.379 W= 38.106274 b= -3.9546213
Epoch: 0950 cost= 0.377 W= 38.110996 b= -4.088267
Epoch: 1000 cost= 0.376 W= 38.114582 b= -4.189459
Optimization Finished!
Training cost= 0.37628764 W= 38.114582 b= -4.189459 

png

由此就可以推算出投入和產出比例。

由於文章是由jupyter寫成,部落格園的markdown無法檢視圖片,建議移步至原文檢視