線性回歸算法


1.本節重點知識點用自己的話總結出來,可以配上圖片,以及說明該知識點的重要性

(1)本節課的內容思維導圖

 

監督學習:可以用於映射出該實例的類別。

無監督學習:我們只知道特征,並不知道答案,不同的實例具有一定的相似性,把那些相似的聚集在一起。

 

(2)回歸與分類的區別

回歸與分類的區別最主要是要看預測的目標函數是否連續,連續變量預測的為回歸,例如:預測明天的氣溫是多少度,這是回歸任務,而對離散變量的預測稱為分類,例如:預測明天天氣是晴還是陰,這是一個分類任務,做預測前首先要分清他是回歸任務還是分類任務,這樣才能選擇合適的算法預測。

(3)回歸算法可以運用的領域

1)房價預測

 

 

 

面積對價格的影響

 

 

 

2)銷售額的預測

 

 

 

3)貸款額度的預測

 

(4)線性關系模型

 

(5)數組與矩陣的運算

數組:

0維:1,2,3

1維:[1,2,3]

2維:[[1,2,3],[4,5,6]]兩行三列2*3

3維:[[[1,2,3],[4,5,6],[4,5,6],[4,5,6]]]

矩陣:

1.矩陣必須是二維的

2.矩陣滿足了特殊的運算要求

相同的內容,執行數組與矩陣的乘法運算

 

數組的乘法運算:

[[1,2,3,4],                        [[1*1,2*2,3*3,4*4],          [[1,4,9,16],

[5,6,7,8],    *  [1,2,3,4]=   [5*1,6*2,7*3,8*4],    =      [5,12,21,32],

[9,10,11,12]]                   [9*1,10*2,11*3,12*4]]      [9,20,33,48]]

矩陣的乘法運算:(兩個矩陣相乘,前者的列數一定與后者的行數相等(m*n) *h*k列)=(m,k列)

主要方法:用左邊矩陣的第一行,逐個乘以右邊矩陣的列,第一行與第一列各個元素的乘積相加,第一行與第二列的各個元素的乘積相加...

[[1,2,3,4],         [ [1],               [[1*1+2*2+3*3+4*4],      

[5,6,7,8],    *     [2],       =       [5*1+6*2+7*3+8*4],       =     [[30],[70],[110]]

[9,10,11,12]]     [3],               [9*1+10*2+11*3+12*4]]

                         [4] ]   

矩陣的這種運算正好可以滿足了線性回歸的計算基礎,所以我們首先要學會矩陣的運算

(6)損失函數

 

 

 

(7)兩種減少誤差的方式

1)最小二乘法之正規方程

 

 

 

T:將矩陣轉置(行變列,列變行)

X-1 :求逆矩陣(X*=單位矩陣 ,?就是x的逆矩陣)

2)最小二乘法之梯度下降法

 

 

 

 

在單變量的函數中,梯度其實就是函數的微分,代表着函數在某個給定點的切線的斜率。

在多變量函數中,梯度是一個向量,向量有方向,梯度的方向就指出了函數在給定點的上升最快的方向。

代碼

import random
import time
import matplotlib.pyplot as plt

# 創建數據
_xs = [0.1 * x for x in range(0, 10)]
_ys = [12 * i + 4 for i in _xs]
print(_xs)
print(_ys)

w = random.random()   #權重
print(w)
b = random.random()   #偏置
print(b)
# y=wx+b
a1 = []
b1 = []
for i in range(1):
    for x, y in zip(_xs, _ys):  #遍歷_xs和_ys
        print("x=",x,"y=",y)
        o = w * x + b           #預測值
        print("o=")
        e = (o - y)             #誤差
        print("e=",e)
        loss = e ** 2           #平方損失函數
        dw = 2 * e * x          #對(w*x+b)^2求w的偏導數,梯度
        db = 2 * e * 1          #對(w*x+b)^2求b的偏導數,梯度
        w = w - 0.1 * dw        #梯度下降w
        b = b - 0.1 * db        #梯度下降b
        print('loss={0},w={1},b={2}'.format(loss, w, b))
    a1.append(i)
    b1.append(loss)
    plt.plot(a1, b1)
    plt.pause(0.1)
plt.show()

循環10,損失loss還比較大,wb里實際值12,4還相差較大

 

 

 

隨着訓練次數的變化Loss值的變化:

 

 

 

循環100次,損失變小,wb更加接近實際值

 

隨着訓練次數的變化Loss值的變化:

 

 

 

 

2.思考線性回歸算法可以用來做什么?

線性回歸算法除了上課時提到的預測房價,預測銷售額,預測貸款額度之外,它也可以用來預測一個人的信用、預測山體滑坡的概率,預測是否交通堵塞等等。

2.自主編寫線性回歸算法 ,數據可以自己造,或者從網上獲取。(加分題)

通過網上獲取:

實現:通過房屋的朝向,建造時間,有無電梯 ,樓層高低,面積㎡,裝修程度以及室廳房情況運用線性回歸算法預測房屋價格

 數據來源:

文件為從https://guangzhou.leyoujia.com/esf/樂有家官網爬取的數據
房屋朝向特征化:
南:0
東:1
北:2
西:3
房屋有無電梯特征化:
暫無:0
有電梯:1
房屋樓層特征化:
高樓層:0
中樓層:1
低樓層:2
裝修程度特征化:
普裝:0
精裝:1
毛呸:2
豪裝:3
復制代碼
import pandas from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt # 文件為從https://guangzhou.leyoujia.com/esf/樂有家官網爬取的數據 # 201706120019hdfend.csv文件為處理有導出的數據文件 # 房屋朝向特征化: # 南:0 # 東:1 # 北:2 # 西:3 # 房屋有無電梯特征化: # 暫無:0 # 有電梯:1 # 房屋樓層特征化: # 高樓層:0 # 中樓層:1 # 低樓層:2 # 裝修程度特征化: # 普裝:0 # 精裝:1 # 毛呸:2 # 豪裝:3 data =pandas.read_csv('./venv/data/房產信息.csv') x=data.loc[:, ['朝向', '時間', '電梯','樓層','面積㎡', '', '', '', '裝修程度']] print(x) y=data.iloc[:,9] print(y) # 划分訓練集與測試集 x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.1,random_state=5)#划分訓練集與測試集 print("x的訓練集為:",x_train) print("y的訓練集為:",y_train) # 構建線性LinearRegression回歸模型 LR_model=LinearRegression() LR_model.fit(x_train,y_train) # 訓練模型 print("線性回歸模型構建完成:\n",LR_model) # 用模型調用預測數據,預測結果 LR_pre=LR_model.predict(x_test) print('回歸模型的權值:',LR_model.coef_) print('回歸模型的截距項:',LR_model.intercept_) #繪制線性回歸模型折線圖 plt.rcParams['font.sans-serif'] = 'SimHei' # 設置字體為SimHei顯示中文 plt.rcParams['axes.unicode_minus'] = False # 設置正常顯示字符 p=plt.figure(figsize=(12,30)) # 確定畫布大小 plt.subplot(3,1,1) # 分為三行一列,放在位置1 plt.title("預測結果折線圖") p1=plt.plot(range(y_test.size),y_test,color="#2FBE95") # 繪制真實值折線圖 # bbox_to_anchor(num1,num2)表示legend的位置和圖像的位置關系,num1表示水平位置,num2表示垂直位置。 plt.legend(["預測值"],bbox_to_anchor=(1.01, 0.8), loc=3, borderaxespad=0) # 圖例 plt.subplot(3,1,2) # 分為三行一列,放在位置1 plt.title("真實結果折線圖") plt.plot(range(y_test.size),LR_pre,color="#2A4C68") # 繪制預測值折線圖 plt.legend(["真實值"],bbox_to_anchor=(1.01, 0.8), loc=3, borderaxespad=0) # 圖例 plt.subplot(3,1,3) # 分為三行一列,放在位置1 plt.title("預測與真實值對照折線圖") plt.plot(range(y_test.size),y_test,color="#2FBE95") # 繪制真實值折線圖 plt.plot(range(y_test.size),LR_pre,color="#2A4C68") # 繪制預測值折線圖 plt.legend(["真實值","預測值"],bbox_to_anchor=(1.01, 0.8), loc=3, borderaxespad=0) # 圖例 plt.title("線性回歸模型預測結果") plt.show()
復制代碼

數據詳情

 

x

 

目標值y

 

模型預測結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM