梯度下降法

第一次作业:计算机应用数学

import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(-6,4,60)
y=x**2+2*x+5
plt.plot(x,y) #画图
x=3#初始化
alaph=0.8#步长
iteraterNum=250#迭代次数
for i in range(iteraterNum):
	x=x-alaph*(2*x+2)
print('二元函数图像最小值:x=',x)
更正:步长太大
import numpy as np
import matplotlib.pyplot as plt

x_values = []  # 存储每次梯度下降后的 x 值
x = 3  # 初始化
alaph = 0.1  # 步长
iteraterNum = 50  # 迭代次数

for i in range(iteraterNum):
    gradient = 2 * x + 2  # 计算梯度
    x = x - alaph * gradient  # 更新 x
    x_values.append(x)  # 将当前 x 值添加到列表中
    print(f'第 {i + 1} 次梯度下降后 x 的值: {x}')

# 绘制图像
x_values = np.array(x_values)
y_values = x_values**2 + 2*x_values + 5

plt.plot(x_values, y_values, marker='o', linestyle='-', color='b')
plt.title('Gradient Descent Optimization')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

print('二元函数图像最小值:x=', x)

优势:求局部最优解

 运行结果如图

随机梯度下降算法:

公式:

θ=θ−α∇J(θ;x(i),y(i))

θ代表模型参数 w权重

α代表学习率

最后一个代表梯度,对w权重和b偏置的偏导

通过该公式即可更新w和b的值

目标函数可以写成连加或期望的形式

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
##### 产生数据集 #####
x = np.arange(0,50)

np.random.seed(1)

#添加50个随机噪声,范围[-5,5]

random_array=(np.random.random(50)*2-1)*5

y = 2 * x + random_array

#转换二维数组

x=x.reshape(50,1)

y=y.reshape(50,1)
data=np.concatenate((x,y),axis=1)

plt.scatter(x,y)

plt.show()

def ML():
    l=LinearRegression().fit(x,y)
##### 机器学习模块调用 #####


# 绘制数据散点图和拟合直线
plt.scatter(x, y)

plt.plot(x,l.predict(x),color='red',linewidth=3)

plt.show()
def SGD():

    NUM=1 #标记

N = 1000 #最大循环次数

epsilon = 190 #误差阈值

theta = np.random.rand() # 线性模型的系数

learning_rate = 0.001 # 学习率

#x = np.hstack([np.ones((50,1)),x]) # 增加全1列

np.random.shuffle(data)

#训练集与测试集

train_data=data[:40]

#存放数据列表

theta_list=[]

loss_list=[]
while True:

    np.random.shuffle(train_data)

for n in range(N):

#取随机样本

    randint = np.random.randint(0,40)

temp_x = train_data[randint][0]

temp_y = train_data[randint][1]

#计算梯度

grad = temp_x * (temp_x * theta - temp_y)

theta = theta - learning_rate*grad

x=train_data[:,0]

y=train_data[:,1]
loss=np.sum(0.5*(theta*x-y)**2)

theta_list.append(theta)

loss_list.append(loss)

NUM=NUM+1

print("num: %d ,theta: %s ,loss: %s "%(NUM,theta,loss))

if loss<epsilon:

    break

plt.scatter(x,y)

plt.plot(x,x*theta,color='red',linewidth=3)

plt.show()



if __name__=="__main__":


    SGD()

运行结果如下,部分函数未运行出来待解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值