線性迴歸實現——梯度下降

線性迴歸實現

y=ax+by = ax + b

x,y 是向量,a,b是標量

梯度下降法:

a=aαcostaa = a - \alpha \frac{\partial cost}{\partial a}

cost=12mi=1m(yiyi)2cost= \frac{1}{2m}\sum^m_{i=1}(y_i - y`_i)^2

cost :代價函數

實驗數據:

在這裏插入圖片描述

實現結果:

在這裏插入圖片描述

算法流程:

在這裏插入圖片描述

代碼實現:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


# 線性迴歸實現 梯度下降方法
# y = ax + b
# a, b 是標量
# x, y 是向量


# 模型 y = ax + b, 需要訓練出 a 和 b 的值
def model(a, b, x):
    # numpy的廣播特徵
    # print(a, b, x)
    ret = a*x+b
    # print("ret :  ", ret)
    # ret = [a*i+b for i in x]
    # print(ret)
    return ret


# 代價|損失函數
def cost_function(a, b, x, y, n=5):
    # 1/(2n) * sum( square(yi -yi`) )
    return 0.5 / n * (np.square(y - a * x - b)).sum()


# 梯度下降方法 對a,b進行優化
def optimize(a, b, x, y, n=5):
    # a = a-alpha*(損失函數對a求偏導)
    alpha = 1e-1
    y_hat = model(a, b, x)
    da_t = y_hat - y
    da = (1.0 / n) * ((y_hat - y) * x).sum()
    db = (1.0 / n) * (y_hat - y).sum()
    a = a - alpha * da
    b = b - alpha * db
    return a, b


# 使用x, y 向量訓練出 a, b兩個標量
def train(x, y, cost=10000):
    # 初始化 a=b=0
    a = b = 0.0
    # 進入循環 直到到達循環結束條件
    # 循環結束條件:損失函數最小值   #這兒我是用控制循環次數來結束循環
    while True:
        # 優化方法 使用梯度下降的算法,對a,b進行優化
        a, b=optimize(a, b, x, y)
        cost = cost - 1
        if cost == 0:
            break
    return a, b


if __name__ == "__main__":
    # 數據提取 使用pandas
    # ds 的類型:<class 'pandas.core.frame.DataFrame'>
    ds = pd.read_csv("LinearRegression.csv")

    print(type(np.array(ds.iloc[:, [1]])),np.array(ds.iloc[:, [1]]))
    # 將數據變成一維
    # np.array(ds.iloc[:, [1]])
    # 將 <class 'pandas.core.frame.DataFrame'> 轉換爲 <class 'numpy.ndarray'>
    # narray.reshape(-1) 將 numpy.narray 的多維轉換爲一維
    x = np.array(ds.iloc[:, [1]]).reshape(-1)
    print(type(x), x)
    y = np.array(ds.iloc[:, [2]]).reshape(-1)
    # x = [float(i) for i in x]
    # y = [float(i) for i in y]
    # print(type(np.array(ds.iloc[:, [1]]).reshape(-1)),np.array(ds.iloc[:, [1]]).reshape(-1) )
    # print(type(x), x)
    # print(type(y), y)
    # 使用 6 張圖片顯示
    count = 1
    for i in range(1, 7):
        plt.subplot(3, 2, i)
        a, b = train(x, y, count)
        plt.plot(x, y, "bo")
        plt.plot(x, model(a, b, x))
        count = count * 3
    plt.show()



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章