操作系統 : CentOS7.3.1611_x64 python版本:2.7.5 sklearn版本:0.18.2 tensorflow版本 :1.2.1 線性回歸是利用數理統計中回歸分析, 來確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法, 運用十分廣泛。 其表達形式為y = w'x ...
操作系統 : CentOS7.3.1611_x64
python版本:2.7.5
sklearn版本:0.18.2
tensorflow版本 :1.2.1
線性回歸是利用數理統計中回歸分析, 來確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法, 運用十分廣泛。 其表達形式為y = w'x+e,e為誤差服從均值為0的正態分佈。
根據變數個數的多少可以分為一元線性回歸和多元線性回歸。
回歸模型中, 一元回歸是最簡單且穩健的, 但描述複雜系統的行為時往往乏力, 因此基於多元回歸的預測技術更為常見。傳統的多元回歸模型一般是線性的,由於可能存在的不顯著變數以及各自變數之間的相關關係,會 導致回歸的正規方程組出現嚴重的病態, 影響到回歸方程的穩定性, 所以多元線性回歸面臨的一個基本問題是尋找“最優”回歸方程。
一元線性回歸
回歸分析中,只包括一個自變數和一個因變數,且二者的關係可用一條直線近似表示,稱為一元線性回歸分析。 其表達形式為:
Y = a + b*X + e
其中a表示截距,b表示直線的斜率,e是誤差項。這個方程可以根據給定的預測變數(X)來預測目標變數(Y)的值。
當a=1,b=2,e=0.1時,曲線如下(Y = 1 + 2 * X + 0.1):
常見應用場景:
簡單地預測商品價格、成本評估等
使用sklearn解決一元線性回歸問題
示例代碼:
#! /usr/bin/env python # -*- coding:utf-8 -*- # version : Python 2.7.5 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression rng = np.random.RandomState(1) X = 10 * rng.rand(30) Y = 1 + 2 * X + rng.randn(30) #print X #print Y model = LinearRegression(fit_intercept=True) model.fit(X[:, np.newaxis], Y) xfit = np.linspace(0, 20, 100) yfit = model.predict(xfit[:, np.newaxis]) plt.scatter(X, Y) plt.plot(xfit, yfit) plt.show()
該代碼的github地址:
https://github.com/mike-zhang/pyExamples/blob/master/algorithm/LinearRegression/lr_sklearn_test1.py
運行效果如下:
使用tensorflow解決一元線性回歸問題
示例代碼:
#! /usr/bin/env python #-*- coding:utf-8 -*- #python version : 2.7.5 #tensorflow version : 1.2.1 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt N = 200 # 樣本數據格式 trainNum = 30 # 訓練次數 # 公式 : y = w * x + b X = np.linspace(-1, 1, N) Y = 3.0 * X + np.random.standard_normal(X.shape) * 0.3 + 0.9 X = X.reshape([N, 1]) Y = Y.reshape([N, 1]) # 期望的圖 plt.scatter(X, Y) plt.plot(X, 3.0 * X + 0.9) plt.show() # 建模 inputX = tf.placeholder(dtype=tf.float32, shape=[None, 1]) outputY = tf.placeholder(dtype=tf.float32, shape=[None, 1]) W = tf.Variable(tf.random_normal([1, 1], stddev=0.01)) b = tf.Variable(tf.random_normal([1], stddev=0.01)) pred = tf.matmul(inputX, W)+b loss = tf.reduce_sum(tf.pow(pred - outputY, 2)) train = tf.train.GradientDescentOptimizer(0.001).minimize(loss) tf.summary.scalar("loss", loss) merged = tf.summary.merge_all() init = tf.global_variables_initializer() # 訓練 with tf.Session() as sess: sess.run(init) for i in range(trainNum): sess.run(train,feed_dict={inputX : X, outputY : Y}) predArr, lossArr = sess.run([pred, loss], feed_dict={inputX : X, outputY : Y}) # print "lossArr : ",lossArr # print "predArr : ",predArr summary_str = sess.run(merged, feed_dict={inputX : X, outputY : Y}) WArr, bArr = sess.run([W, b]) print(WArr, bArr) # 預測的圖 plt.scatter(X, Y) plt.plot(X , WArr * X + bArr) plt.show()
該代碼的github地址:
運行效果如下:
(array([[ 0.4075802]], dtype=float32), array([ 0.35226884], dtype=float32)) (array([[ 0.75750935]], dtype=float32), array([ 0.56450701], dtype=float32)) (array([[ 1.06031227]], dtype=float32), array([ 0.69184995], dtype=float32)) (array([[ 1.32233584]], dtype=float32), array([ 0.76825565], dtype=float32)) (array([[ 1.54907179]], dtype=float32), array([ 0.81409913], dtype=float32)) (array([[ 1.7452724]], dtype=float32), array([ 0.84160519], dtype=float32)) (array([[ 1.91505003]], dtype=float32), array([ 0.85810882], dtype=float32)) (array([[ 2.06196308]], dtype=float32), array([ 0.868011], dtype=float32)) (array([[ 2.18909097]], dtype=float32), array([ 0.87395233], dtype=float32)) (array([[ 2.29909801]], dtype=float32), array([ 0.8775171], dtype=float32)) (array([[ 2.39428997]], dtype=float32), array([ 0.87965596], dtype=float32)) (array([[ 2.47666216]], dtype=float32), array([ 0.8809393], dtype=float32)) (array([[ 2.54794097]], dtype=float32), array([ 0.88170928], dtype=float32)) (array([[ 2.60962057]], dtype=float32), array([ 0.88217127], dtype=float32)) (array([[ 2.66299343]], dtype=float32), array([ 0.88244849], dtype=float32)) (array([[ 2.70917845]], dtype=float32), array([ 0.88261479], dtype=float32)) (array([[ 2.7491436]], dtype=float32), array([ 0.88271457], dtype=float32)) (array([[ 2.78372645]], dtype=float32), array([ 0.88277447], dtype=float32)) (array([[ 2.81365204]], dtype=float32), array([ 0.88281041], dtype=float32)) (array([[ 2.8395474]], dtype=float32), array([ 0.88283193], dtype=float32)) (array([[ 2.8619554]], dtype=float32), array([ 0.88284487], dtype=float32)) (array([[ 2.88134551]], dtype=float32), array([ 0.88285261], dtype=float32)) (array([[ 2.89812446]], dtype=float32), array([ 0.88285726], dtype=float32)) (array([[ 2.91264367]], dtype=float32), array([ 0.88286006], dtype=float32)) (array([[ 2.92520738]], dtype=float32), array([ 0.88286173], dtype=float32)) (array([[ 2.93607926]], dtype=float32), array([ 0.88286275], dtype=float32)) (array([[ 2.94548702]], dtype=float32), array([ 0.88286334], dtype=float32)) (array([[ 2.95362759]], dtype=float32), array([ 0.8828637], dtype=float32)) (array([[ 2.9606719]], dtype=float32), array([ 0.88286394], dtype=float32)) (array([[ 2.96676755]], dtype=float32), array([ 0.88286406], dtype=float32))
多元線性回歸
回歸分析中,包括兩個或兩個以上的自變數,且因變數和自變數之間是線性關係,則稱為多元線性回歸分析。
其表達形式為:
Y = a0 + a1 * X1 + a2 * X2 + ... + an * Xn + e
其中,
(a0,a1,a2,a3,...,an)為(固定的)未知的參數向量
(X1,X2,X3,...,Xn)為解釋變數, 其可以為固定的(設計的), 或者隨機的
e 為隨機誤差項
這個方程可以根據給定的預測向量(X1,X2,X3,...,Xn)來預測目標變數(Y)的值。
當a0=1,a1=2,a2=3,e=0.1時,方程如下:
Y = 1 + 2 * X1 + 3 * X2 + 0.1
使用sklearn解決多元線性回歸問題
示例代碼:
#! /usr/bin/env python #-*- coding:utf-8 -*- # version : Python 2.7.5 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression rng = np.random.RandomState(1) N = 10 X = np.array(N * [10 * rng.rand(2)]) b = [2, 3] Y = 1 + np.matmul(X,b) + rng.randn(N) print X print Y model = LinearRegression() model.fit(X, Y) xfit = np.array(10 * [10 * rng.rand(2)]) yfit = model.predict(xfit) print "xfit :" print xfit print "yfit :" print yfit
該代碼的github地址:
https://github.com/mike-zhang/pyExamples/blob/master/algorithm/LinearRegression/lr_sklearn_test2.py
運行效果如下:
[[ 4.17022005 7.20324493] [ 4.17022005 7.20324493] [ 4.17022005 7.20324493] [ 4.17022005 7.20324493] [ 4.17022005 7.20324493] [ 4.17022005 7.20324493] [ 4.17022005 7.20324493] [ 4.17022005 7.20324493] [ 4.17022005 7.20324493] [ 4.17022005 7.20324493]] [ 30.42200315 29.87720628 31.81558253 28.6486362 32.69498666 30.188968 31.26921399 30.70080452 32.41228283 28.89003419] xfit : [[ 1.40386939 1.98101489] [ 1.40386939 1.98101489] [ 1.40386939 1.98101489] [ 1.40386939 1.98101489] [ 1.40386939 1.98101489] [ 1.40386939 1.98101489] [ 1.40386939 1.98101489] [ 1.40386939 1.98101489] [ 1.40386939 1.98101489] [ 1.40386939 1.98101489]] yfit : [ 12.7586356 12.7586356 12.7586356 12.7586356 12.7586356 12.7586356 12.7586356 12.7586356 12.7586356 12.7586356]
好,就這些了,希望對你有幫助。
本文github地址:
https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170728_線性回歸學習筆記.rst
歡迎補充