最近烫金学长正在学习机器学习,我也抽闲时间上了会车~
(以下都是自己根据末尾文章不理解的地方瞎记录.梯度下降法
求解一元线性
梯度下降求解算法是一种迭代算法,即在求最小二乘的时候
朝向梯形负方向(梯形正方向定义为增长速度最快)按照一定步长迭代下降 直到符合我们的预期要求 (步长也就是定义的学习率我们使用机器学习就是拟合我们所需要的方程,使它尽可能的符合预期的"模仿方程式"
即对于一个一元线性方程,我们代入训练数据,使它每个数据点与预期点的差异越小就好啦~ 即对于y=ax+b,我们可以求ax+b-y作为代价函数(我们评判学习结果的依据模型) 根据一系列的转换,我们可以得到下面关于一元方程偏导
然后就是使用代码翻译公式
# encoding: utf-8from sklearn import linear_modelalpha = 0.01# 精度设定epsilon = 1e-8# 目标函数y=2x+1x = [1., 2., 3., 4., 5., 6., 7., 8., 9.]y = [3., 5., 7., 9., 11., 13., 15., 17., 19.]# scikit-learn的求解方法def solve_by_scikit(): # 使用scikit-learn求解 # reg = linear_model.SGDClassifier(loss="hinge", penalty="l2") # reg.fit(x, y) print("暂无")# 采用梯度下降法求解一元线性回归 def solve_by_gradient(): # 获取循环的长度 m = len(x) a, b, sse2 = 0, 0, 0 while True: grad_a, grad_b = 0, 0 for i in range(m): # 求(a*x(i)+b-y[i])的a,b偏导 # 这里使用common感觉更好,公式相同处 common = a * x[i] + b - y[i] grad_a += x[i] * common grad_b += common grad_a = grad_a / m grad_b = grad_b / m # 梯形下降(梯形负方向,速度下降最快)迭代求符合最小值的a,b # alpha设置迭代步长,即学习率 a -= alpha * grad_a b -= alpha * grad_b sse = 0 for j in range(m): sse += (a * x[j] + b - y[j]) ** 2 / (2 * m) # 拟合结果判断相差绝对值 if abs(sse2 - sse) < epsilon: break else: sse2 = sse print('{0} * x + {1}'.format(a, b))def main(): try: print("scikit模拟结果:") solve_by_scikit() print("梯形下降模拟结果:") solve_by_gradient() except BaseException as e: print("\n=>错误: ", e)if __name__ == "__main__": main()
求解多元
待研究
PS:机器学习方便还是很要求数学基础的,可以说都是数学问题~
参考文章: