機器學習之一元線性迴歸

概述

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

線性迴歸的目的

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

一元線性迴歸

定義

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

實例講解

背景

王經理是一家汽車銷售公司的銷售負責人,他深知投放互聯網視頻廣告對於銷售收入有提振做用,通過一年的實踐,獲得了2017年每月的廣告投入和銷售額的數據。數據以下表所示:github

月份 廣告投入(萬) 銷售額(萬)
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沒法查看圖片,建議移步至原文查看markdown

相關文章
相關標籤/搜索