@tocpython
回归能够作任何事情。然而大多数公司经常使用回归法作一些比较沉闷的事情,例如:算法
固然也能够作有新意的应用,例如:数组
从咱们最熟悉的开始, 已知两点,求直线公式设 y = ax+b, 带入两点,求得解析解为 y = 3x-60dom
这个例子是预测住房价格的,咱们要使用一个数据集,数据集包含西安市的住房价格。在这里,我要根据不一样房屋尺寸所售出的价格,画出个人数据集。比方说,若是你朋友的房子是40平方米大小,你要告诉他们这房子能卖多少钱。那么,你能够作的一件事就是构建一个模型,也许是条直线,从这个数据模型上来看,也许你能够告诉你的朋友,他能以大约78万(人民币)左右的价格卖掉这个房子。这就是监督学习算法的一个例子。机器学习
m:表示训练集数据的总量 x:表示输入变量 y:表示输出变量 (x,y): 表示一个训练样本 (x(i),y(i)): 表示第i个训练样本
对于一元线性回归(单变量线性回归)来讲,学习算法为 y = ax + b
咱们换一种写法: hθ(x) = θ0 + θ1x1函数
from sklearn.linear_model import LinearRegression import numpy as np # 1).模拟数据 X = np.random.rand(100, 1) Y = 4 + 2 * X + np.random.randn(100, 1) # 2). 调用sklearn拟合数据, 把theta0 theta1求出来 # 导入线性回归类 lin_reg = LinearRegression() # 让线性回归类作训练 lin_reg.fit(X, Y) # 输出theta0 theta1; intercept_是截距, coef_是斜率系数; print("\ntheat0, theta1:", lin_reg.intercept_, lin_reg.coef_) # 3). 预测 X_new = np.array([[0], [1]]) print("\nx=0, x=1预测结果:\n", lin_reg.predict(X_new))
下面的三张图, 展现了拟合的三种状态:学习
咱们选择的参数决定了咱们获得的直线相对于咱们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是建模偏差(modeling error)。
上图是参考吴恩达视频的图片, 咱们会发现随着theta1的不断变化, 均方偏差MSE会找到一个最小值。 若是从数学角度来看, 就是求解函数的导数,计算函数的最小值。测试
上图是参考吴恩达视频的图片, 咱们会发现随着theta0和theta1的不断变化, 均方偏差MSE会找到一个最小值。为了经过图形化看到最小的均方差, 三维图片并不直观。 一般使用等高线实现。以下图:spa
咱们会遇到更复杂、更高维度、更多参数的状况,而这些状况是很难画出图的,所以更没法将其可视化,所以咱们真正须要的是编写程序来找出这些最小化代价函数的和的值,而梯度降低算法就是可以自动地找出能使代价函数最小化的参数和的值。3d
梯度降低是一个用来求函数最小值的算法,咱们将使用梯度降低算法来求出代价函数的最小值。
梯度降低背后的思想是:开始时咱们随机选择一个参数的组合,计算代价函数,而后咱们寻找下一个能让代价函数值降低最多的参数组合。咱们持续这么作直到到到一个局部最小值(local minimum),由于咱们并无尝试完全部的参数组合,因此不能肯定咱们获得的局部最小值是否即是全局最小值(global minimum),选择不一样的初始参数组合,可能会找到不一样的局部最小值。
想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度降低算法中,咱们要作的就是旋转360度,看看咱们的周围,并问本身要在某个方向上,用小碎步尽快下山。这些小碎步须要朝什么方向?若是咱们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,而后再一次想一想,我应该从什么方向迈着小碎步下山?而后你按照本身的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,而后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。
理解
批梯度降低:指的是每降低一步,使用全部的训练集来计算梯度值
""" 线性回归实现梯度降低的批处理(batch_gradient_descent ) """ import numpy as np X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) X_b = np.c_[np.ones((100, 1)), X] # print(X_b) learning_rate = 0.1 # 一般在作机器学习的时候,通常不会等到他收敛,由于太浪费时间,因此会设置一个收敛次数 n_iterations = 100000 m = 100 # 1.初始化theta, w0...wn theta = np.random.randn(2, 1) count = 0 # 4. 不会设置阈值,之间设置超参数,迭代次数,迭代次数到了,咱们就认为收敛了 for iteration in range(n_iterations): count += 1 # 2. 接着求梯度gradient gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y) # 3. 应用公式调整theta值, theta_t + 1 = theta_t - grad * learning_rate theta = theta - learning_rate * gradients print(count) print(theta)
随机梯度降低:指的是每降低一步,使用一条训练集来计算梯度值
“Mini-Batch”梯度降低:指的是每降低一步,使用一部分的训练集来计算梯度值