随机梯度下降算法及其注释

# -*- coding:utf8 -*-

import math
import matplotlib.pyplot as plt

def f(w, x):
N = len(w)
i = 0
y = 0
while i < N - 1:
y += w[i] * x[i]
i += 1
y += w[N - 1] # 常数项
return y

def gradient(data, w, j):
M = len(data) # 样本数
N = len(data[0])
i = 0
g = 0 # 当前维度的梯度
while i < M:
y = f(w, data[i])
if (j != N - 1):
g += (data[i][N - 1] - y) * data[i][j]
else:
g += data[i][N - 1] - y
i += 1
return g / M

def gradientStochastic(data, w, j):
N = len(data) # 维度
y = data[N - 1] - f(w, data)
if (j != N - 1):
return y * data[j]
return y # 常数项

def isSame(a, b):
n = len(a)
i = 0
while i < n:
if abs(a[i] - b[i]) > 0.01:
return False
i += 1
return True

def fw(w, data):
M = len(data) # 样本数
N = len(data[0])
i = 0
s = 0
while i < M:
y = data[i][N - 1] - f(w, data[i])
s += y ** 2
i += 1
return s / 2

def fwStochastic(w, data):
y = data[len(data) - 1] - f(w, data)
y **= 2
return y / 2

def numberProduct(n, vec, w):
N = len(vec)
i = 0
while i < N:
w[i] += vec[i] * n
i += 1

def assign(a):
L = []
for x in a:
L.append(x)
return L

# a = b
def assign2(a, b):
i = 0
while i < len(a):
a[i] = b[i]
i += 1

def dotProduct(a, b):
N = len(a)
i = 0
dp = 0
while i < N:
dp += a[i] * b[i]
i += 1
return dp

# w当前值;g当前梯度方向;a当前学习率;data数据
def calcAlpha(w, g, a, data):
c1 = 0.3
now = fw(w, data)
wNext = assign(w) #复制一份w
numberProduct(a, g, wNext) #利用w = w + alpha(y-f(x))x 更新 w
next = fw(wNext, data) # 计算整个1000个样本的loss
# 寻找足够大的a,使得h(a)>0
count = 30
while next < now:
a *= 2
wNext = assign(w)
numberProduct(a, g, wNext)
next = fw(wNext, data)
count -= 1
if count == 0:
break

# 寻找合适的学习率a
count = 50
while next > now - c1*a*dotProduct(g, g):
a /= 2
wNext = assign(w)
numberProduct(a, g, wNext)
next = fw(wNext, data)

count -= 1
if count == 0:
break
return a

# w当前值;g当前梯度方向;a当前学习率;data数据
def calcAlphaStochastic(w, g, a, data):
c1 = 0.01 # 因为是每个样本都下降,所以参数运行度大些,即:激进一些
now = fwStochastic(w, data) #计算当前的全体样本的LOSS
wNext = assign(w) #重新复制一份W
numberProduct(a, g, wNext) #利用w = w + alpha*(y-f(x))*x 计算更新W
next = fwStochastic(wNext, data) #利用更新后的W 计算全体样本LOSS
# 寻找足够大的a,使得h(a)>0
count = 30
while next < now:
if a < 1e-10:
a = 0.01
else:
a *= 2
wNext = assign(w)
numberProduct(a, g, wNext)
next = fwStochastic(wNext, data)
count -= 1
if count == 0:
break

# 寻找合适的学习率a
count = 50
while next > now - c1*a*dotProduct(g, g):
a /= 2
wNext = assign(w)
numberProduct(a, g, wNext)
next = fwStochastic(wNext, data)

count -= 1
if count == 0:
break
return a

def normalize(g):
s = 0
for x in g:
s += x * x
s = math.sqrt(s)
i = 0
N = len(g)
while i < N:
g[i] /= s
i += 1

def calcCoefficient(data, listA, listW, listLostFunction):
M = len(data) # 样本数目
N = len(data[0]) # 维度
w = [0 for i in range(N)]
wNew = [0 for i in range(N)]
g = [0 for i in range(N)]

times = 0
alpha = 100.0 # 学习率随意初始化
same = False
while times < 10000:
i = 0
while i < M:
j = 0
while j < N:
g[j] = gradientStochastic(data[i], w, j)
j += 1
normalize(g) # 正则化梯度
alpha = calcAlphaStochastic(w, g, alpha, data[i])
#alpha = 0.01
numberProduct(alpha, g, wNew)

print "times,i, alpha,fw,w,g:\t", times, i, alpha, fw(w, data), w, g
if isSame(w, wNew):
if times > 5: #防止训练次数过少
same = True
break
assign2(w, wNew) # 更新权值

listA.append(alpha)
listW.append(assign(w))
listLostFunction.append(fw(w, data))

i += 1
if same:
break
times += 1
return w

if __name__ == "__main__":
fileData = open("d8.txt")
data = []
for line in fileData:
d = map(float, line.split(‘,‘))
data.append(d)
fileData.close()

listA = [] # 每一步的学习率
listW = [] # 每一步的权值
listLostFunction = [] # 每一步的损失函数值
w = calcCoefficient(data, listA, listW, listLostFunction)

# 绘制学习率
plt.plot(listA, ‘r-‘, linewidth=2)
plt.plot(listA, ‘go‘)
plt.xlabel(‘Times‘)
plt.ylabel(‘Ratio/Step‘)
plt.show()

# 绘制损失
listLostFunction = listLostFunction[0:100]
listLostFunction[0] /= 2
plt.plot(listLostFunction, ‘r-‘, linewidth=2)
plt.plot(listLostFunction, ‘gv‘, alpha = 0.75)
plt.xlabel(‘Times‘)
plt.ylabel(‘Loss Value‘)
plt.grid(True)
plt.show()

# 绘制权值
X = []
Y = []
for d in data:
X.append(d[0])
Y.append(d[1])
plt.plot(X, Y, ‘cp‘, label=u‘Original Data‘, alpha=0.75)
x = [min(X), max(X)]
y = [w[0] * x[0] + w[1], w[0] * x[1] + w[1]]
plt.plot(x, y, ‘r-‘, linewidth=3, label=‘Regression Curve‘)
plt.legend(loc=‘upper left‘)
plt.grid(True)
plt.show()

时间: 2024-11-06 07:29:08

随机梯度下降算法及其注释的相关文章

神经网络与深度学习(2):梯度下降算法和随机梯度下降算法

本文总结自<Neural Networks and Deep Learning>第1章的部分内容. 使用梯度下降算法进行学习(Learning with gradient descent) 1. 目标 我们希望有一个算法,能让我们找到权重和偏置,以至于网络的输出y(x) 能够拟合所有的训练输入x. 2. 代价函数(cost function) 定义一个Cost function (loss function, objective function): 目标函数,如下: C: 被称为二次代价函数

感知机2 -- 随机梯度下降算法

声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结.不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,因为本人在学习初始时有非常多数学知识都已忘记.因此为了弄懂当中的内容查阅了非常多资料.所以里面应该会有引用其它帖子的小部分内容,假设原作者看到能够私信我.我会将您的帖子的地址付到以下. 3,假设有内容错误或不准确欢迎大家指正. 4,假设能帮到你,那真是太好了. 概述 随意选取一超平面w0.b0,然后用随机梯度下降算法不断极小化L(w, b). Ps: 极小化的

监督学习:随机梯度下降算法(sgd)和批梯度下降算法(bgd)

线性回归 首先要明白什么是回归.回归的目的是通过几个已知数据来预测另一个数值型数据的目标值. 假设特征和结果满足线性关系,即满足一个计算公式h(x),这个公式的自变量就是已知的数据x,函数值h(x)就是要预测的目标值.这一计算公式称为回归方程,得到这个方程的过程就称为回归. 假设房子的房屋面积和卧室数量为自变量x,用x1表示房屋面积,x2表示卧室数量:房屋的交易价格为因变量y,我们用h(x)来表示y.假设房屋面积.卧室数量与房屋的交易价格是线性关系. 他们满足公式 上述公式中的θ为参数,也称为权

Hulu机器学习问题与解答系列 | 十七:随机梯度下降算法之经典变种

这是本周第二篇机器学习,也是Hulu面试题系列的第十七篇了~ 之前的所有内容都可以在菜单栏的"机器学习"中找到,愿你温故,知新. 今天的内容是 [随机梯度下降算法之经典变种] 场景描述 提到Deep Learning中的优化方法,人们都会想到Stochastic Gradient Descent (SGD),但是SGD并不是理想的万金油,反而有时会成为一个坑.当你设计出一个deep neural network时,如果只知道用SGD来训练,不少情况下你得到一个很差的训练结果,于是你放弃

随机梯度下降算法求解SVM

测试代码(matlab)如下: clear; load E:\dataset\USPS\USPS.mat; % data format: % Xtr n1*dim % Xte n2*dim % Ytr n1*1 % Yte n2*1 % warning: labels must range from 1 to n, n is the number of labels % other label values will make mistakes u=unique(Ytr); Nclass=len

机器学习算法(优化)之一:梯度下降算法、随机梯度下降(应用于线性回归、Logistic回归等等)

本文介绍了机器学习中基本的优化算法-梯度下降算法和随机梯度下降算法,以及实际应用到线性回归.Logistic回归.矩阵分解推荐算法等ML中. 梯度下降算法基本公式 常见的符号说明和损失函数 X :所有样本的特征向量组成的矩阵 x(i) 是第i个样本包含的所有特征组成的向量x(i)=(x(i)1,x(i)2...,x(i)n) y(i) 第i个样本的label,每个样本只有一个label,y(i)是标量(一个数值) hθ(x(i)) :拟合函数,机器学习中可以用多种类型的拟合函数 θ 是函数变量,

梯度下降算法

首先定义几个符号: Xi vector[X]:input data Yi vector[Y]:output data h(X) hypothesis function 对于输入的数据给出预测值 Y is continous variation?regression problem(回归问题) Y is discrete variation?classification problem(分类问题) PART 1:线性回归 如图,蓝色的离散点是Xi,红色的线就是求出的回归函数. hypothesis

梯度下降算法的一点认识

昨天开始看Ng教授的机器学习课,发现果然是不错的课程,一口气看到第二课. 第一课 没有什么新知识,就是机器学习的概况吧. 第二课 出现了一些听不太懂的概念.其实这堂课主要就讲了一个算法,梯度下降算法.到了教授推导公式的时候感觉有点蒙,不过后来仔细想想,也大概理解了,这个算法并没有想象的晦涩.在这堂课中,梯度下降算法是为了解决线性回归问题的.视频中的例子是给你一堆训练数据,(房子面积和对应房价),如果此时给你一个没有出现过的房子面积数据,您能否给出正确的房价?解决思路是首先要看出来房子面积跟房价之

梯度下降法VS随机梯度下降法 (Python的实现)

1 # -*- coding: cp936 -*- 2 import numpy as np 3 import matplotlib.pyplot as plt 4 5 6 # 构造训练数据 7 x = np.arange(0., 10., 0.2) 8 m = len(x) # 训练数据点数目 9 x0 = np.full(m, 1.0) 10 input_data = np.vstack([x0, x]).T # 将偏置b作为权向量的第一个分量 11 target_data = 2 * x