秒懂機器學習---梯度下降簡單實例


秒懂機器學習---梯度下降簡單實例

一、總結

一句話總結:

機器學習中:但凡能夠把數據映射到多維空間的那個圖形上,那么事情就變的比較好解決了
別人要不要你,就是看你有沒有震撼到別人,你的各個方面的實力和魅力

 

1、python支持函數中定義函數實例?

python中函數里面可以定義函數:比如在梯度下降中我們可以把 偏導那個函數定義在梯度下降函數里面
def test():
    def derivative(x_pre):  # f(x)的導數
        return 2 * x_pre + 3

 

 

2、梯度下降真的非常簡單,最核心理解的是哪兩步?

1、將問題映射在圖上,映射在多維空間上
2、理解梯度下降公式:x = x - αg(x),g(x)為f(x)的導數

 

3、梯度下降公式中的x = x - αg(x),- αg(x)在實驗中的表現是什么?

由初始點向最優點靠近:將x的值,從1,穿越0,由正到負,然后最后到達最優解-1.5旁邊
一般的x和步子的正相關性:αg(x)是和x相關的函數,一般是x越大,|αg(x)|越大,αg(x)變化的越快,尋找梯度的步子邁的越大

 

4、梯度下降實例(要多看代碼)?

比如求f(x) = x2+3x+4 的最優解
# -*- coding: utf-8 -*-
# @Desc  : 梯度下降計算函數的極小值

"""
f(x) = x^2 + 3x + 4
f(x)的導數  g(x) = 2x + 3
"""
def test():
    def derivative(x_pre):  # f(x)的導數
        return 2 * x_pre + 3

    x_pre = -5  # 初始值
    x_now = 1  # 梯度下降初始值
    alpha = 0.01  # 學習率,即步長
    pression = 0.00001  # 更新的閥值
    count = 0  # 統計迭代次數

    while abs(x_now - x_pre) > pression:
        # print(x_now,'------------',x_pre)
        x_pre = x_now
        # x = x - αg(x),g(x)為f(x)的導數
        x_now = x_pre - alpha * derivative(x_pre)
        count += 1
    print(x_now)
    print(count)
test()

 

5、梯度下降法只能對線性函數起作用么?

並不是:對所連續的有曲線都起作用

 

 

二、機器學習案例——梯度下降與邏輯回歸簡單實例

轉自或參考:機器學習案例——梯度下降與邏輯回歸簡單實例
https://blog.csdn.net/heuguangxu/article/details/80495268

 

梯度下降實例

    下圖是f(x) = x2+3x+4 的函數圖像,這是初中的一元二次函數,它的導數為g(x) = f(x) = 2x+3。我們很明確的知道,當x = -1.5時,函數取得最小值。

 

    下面就通過梯度下降法來計算函數取最小值時x的取值。

# @Desc : 梯度下降計算函數的極小值

""" f(x) = x^2 + 3x + 4 f(x)的導數 g(x) = 2x + 3 """
def test():
    def derivative(x_pre):  # f(x)的導數
        return 2 * x_pre + 3

    x_pre = -5  # 初始值
    x_now = 1  # 梯度下降初始值
    alpha = 0.01  # 學習率,即步長
    pression = 0.00001  # 更新的閥值
    count = 0  # 統計迭代次數

    while abs(x_now - x_pre) > pression:
        x_pre = x_now
        # x = x - αg(x),g(x)為f(x)的導數
        x_now = x_pre - alpha * derivative(x_pre)
        count += 1
    print(x_now)
    print(count)


# 結果
-1.4995140741236221
423

    可以看出,已經非常逼近真實的極值-1.5了,總共經過了423次迭代,邏輯回歸中的梯度下降也是這樣的,只不過函數沒這么簡單而已。

邏輯回歸實例

    自己在編寫代碼過程中,使用的是機器學習案例——鳶尾花數據集分析中提到的鳶尾花數據集,我把其中一個類別刪除了,只留下了兩個類別。經過訓練后,得到參數如下圖所示。

 

    上面的數據有4個特征,不太好展示,因此重新用了別人家的數據,代碼無需變動。建議還是參考別人寫的更詳細(地址在文章末尾),最后得到的參數是下面這個樣子的,畫出來的擬合效果還是不錯的,為了不影響閱讀代碼貼在最后了。

[[-0.47350404] [ 0.74213291] [-5.47457118]]

 

 

參考內容:

    https://github.com/apachecn/MachineLearning/blob/master/src/py2.x/ML/5.Logistic/logistic.py

    http://cuijiahua.com/blog/2017/11/ml_6_logistic_1.html

 

 

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

alpha = 0.001  # 學習率
iteration = 5000  # 迭代次數


# 加載數據集
def load_data():
    # 讀入數據
    df = pd.read_csv('test.csv')

    # 取label標簽
    Y_train = np.mat(df['class'])

    # 將行向量轉換為列向量
    Y_train = np.mat(Y_train)
    Y_train = Y_train.T

    # 刪除最后一列,即刪除標簽列
    df.drop('class', axis=1, inplace=True)

    # 添加一列,當b吧,方便計算,初始化為1
    df['new'] = 1
    X_train = np.mat(df)
    return X_train, Y_train


# 返回最后訓練的參數
def gradient_descent(X_train, Y_train):
    row, col = X_train.shape

    # 初始化,全為0
    W = np.zeros((col, 1))

    # 進行max_iteration次梯度下降
    for i in range(iteration):
        # 直接使用numpy提供的tanh函數
        h = np.tanh(np.dot(X_train, W))
        error = Y_train + h

        # 梯度下降
        W = W - alpha * np.dot(X_train.T, error)
    return W.getA()


# 這段代碼來抄自https://github.com/apachecn/MachineLearning/blob/master/src/py2.x/ML/5.Logistic/logistic.pyu
def plot_show(W):
    X_train, Y_train = load_data()
    xcord1 = []
    ycord1 = []

    xcord2 = []
    ycord2 = []

    for i in range(X_train.shape[0]):
        if int(Y_train[i]) == 1:
            xcord1.append(X_train[i, 0])
            ycord1.append(X_train[i, 1])
        else:
            xcord2.append(X_train[i, 0])
            ycord2.append(X_train[i, 1])

    fig = plt.figure()

    ax = fig.add_subplot(111)
    ax.scatter(xcord1, ycord1, s=20, c='red', marker='s', alpha=.5)
    ax.scatter(xcord2, ycord2, s=20, c='green', alpha=.5)

    x = np.arange(-4.0, 5.0, 0.1)
    """ 函數原型是:f(x) = w0*x0 + w1*x1 + b x1在這里被當做y值了,f(x)被算到w0、w1、b身上去了 所以有:w0*x0 + w1*x1 + b = 0 可以得到:(b + w0 * x) / -w1 """
    y = (W[2] + W[0] * x) / -W[1]

    ax.plot(x, y)
    plt.title('BestFit')
    plt.xlabel('X1')
    plt.ylabel('X2')

    plt.show()


if __name__ == '__main__':
    X_train, Y_train = load_data()
    # print(Y_train)
    W = gradient_descent(X_train, Y_train)
    print(W)
    plot_show(W)
 


免責聲明!

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



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