実際の勾配降下法アルゴリズム

実際の勾配降下法アルゴリズム

前回の記事では、勾配降下法アルゴリズムの数学的原理を詳しく説明しました。前回の記事の数学的原理を表示するには、ここをクリックしてください。この記事では、主に単純な線形回帰を使用して、勾配降下法アルゴリズムの魅力を説明します党の理念を理解していない学生が直接コードをコーディングし、問題に遭遇したときに情報を一つずつ調べることもできますが、より高いレベルの方向に発展する場合、数学は間違いなく不可欠であり、最も基本的な場所に戻る必要があります。大丈夫!もうナンセンスなことはやめて、コードに直接取り組んでください。

1. 情報源

情報は自分でまとめたものですが、もちろん自分で情報を収集したり、ダウンロードしたりすることもできます。情報は次のとおりです。

天気 お食事の人数
25 100
29 67
34 40
33 50
16 40
27 89
30 90
31 55
5 25
15 39
7 28
17 48
22 95

データはxlsx形式でDドライブのルートディレクトリに保存されており、データマップは以下のとおりです。
ここに画像の説明を挿入

2. コード

# -*- coding: utf-8 -*-
"""
AUTHOR: jsonwong
TIME: 2021/9/17
"""

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

def data_process(file_path): # 数据处理函数
    data = pd.read_excel(file_path, header=None, names=['weather', 'number'])
    new_data = data.drop([0])
    new_data.insert(0, 'Ones', 1)
    return new_data

def vectorization(data): # 向量化函数
    cols = data.shape[1]
    X = data.iloc[:, 0:cols-1]  # 取前cols-1列,即输入向量
    y = data.iloc[:, cols-1:cols]  # 取最后一列,即目标向量
    X = np.matrix(X.values)
    y = np.matrix(y.values)
    return X, y

def ComputerCost(X, y, theta): # cost function代价函数
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))

def gradientDescent(X, y, theta, alpha, epoch): # 梯度下降函数
    temp = np.matrix(np.zeros(theta.shape))  # 初始化一个 θ 临时矩阵(1, 2)
    parameters = int(theta.flatten().shape[1])  # 参数 θ的数量
    cost = np.zeros(epoch)  # 初始化一个ndarray,包含每次epoch的cost
    m = X.shape[0]  # 样本数量m

    for i in range(epoch):
        # 利用向量化一步求解
        temp = theta - (alpha / m) * (X * theta.T - y).T * X
        theta = temp
        cost[i] = ComputerCost(X, y, theta)
    return theta, cost

def visualization(new_data, final_theta, *cost): # 可视化函数
    x = new_data["weather"].values # 横坐标
    # x = np.linspace(new_data.weather.min(), new_data.weather.max(), 6)  # 横坐标
    f = final_theta[0, 0] + (final_theta[0, 1] * x)  # 纵坐标
    plt.plot(x, f, 'r', label='Prediction')
    plt.scatter(new_data.weather, new_data.number, label='Traning Data')
    plt.legend(loc=2)  # 2表示在左上角
    plt.xlabel('weather')
    plt.ylabel('number')
    plt.title('Predicted')
    plt.savefig('D:/predicted')
    plt.show()

def iteration_figure(epoch, cost): # 迭代图像函数
    plt.plot(np.arange(epoch), cost, 'r')
    plt.xlabel('epoch')
    plt.ylabel('cost')
    plt.title('error with epoch')
    plt.savefig('D:/error figure')
    plt.show()

def main():
    file_path = 'D:/天气.xlsx'
    theta = np.matrix([0, 0]) # 初始化theta
    new_data = data_process(file_path)
    X, y = vectorization(new_data)
    final_theta, cost = gradientDescent(X, y, theta, 0.003, 10000)
    visualization(new_data, final_theta)
    iteration_figure(10000, cost)

if __name__ == '__main__':
    main()

3. 結果

線形回帰の結果は、次の図に示すとおりです。 以下の図に示すように、
ここに画像の説明を挿入
EXCEL を使用して同じフィッティング直線を描くことができます。フィッティングされた画像とほぼ一​​致していることがわかります (一貫性がないため、反復回数と学習率 α を調整する必要があります)。 フィッティング プロセスは、次の図に示すようになります
ここに画像の説明を挿入

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/JaysonWong/article/details/120345632