概述
線性迴歸是利用數理統計中迴歸分析,來肯定兩種或兩種以上變量間相互依賴的定量關係的一種統計分析方法,運用十分普遍。其表達形式爲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()
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
由此就能夠推算出投入和產出比例。算法
因爲文章是由jupyter寫成,博客園的markdown沒法查看圖片,建議移步至原文查看markdown