秒懂機器學習---梯度下降簡單實例
一、總結
一句話總結:
機器學習中:但凡能夠把數據映射到多維空間的那個圖形上,那么事情就變的比較好解決了
別人要不要你,就是看你有沒有震撼到別人,你的各個方面的實力和魅力
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)
