![f8e4de627265a38de379bc3e230f668b.png](https://img-blog.csdnimg.cn/img_convert/f8e4de627265a38de379bc3e230f668b.png)
【机器学习】算法原理详细推导与实现(一):线性回归
今天我们这里要讲第一个有监督学习算法,他可以用于一个回归任务,这个算法叫做 线性回归
房价预测
假设存在如下 m
组房价数据:
![17cf86da0ae157eaeff3913c9de2aac6.png](https://img-blog.csdnimg.cn/img_convert/17cf86da0ae157eaeff3913c9de2aac6.png)
通过上面的数据,可以做出如下一个图。横坐标是 面积(m^2)
,纵坐标是 价格(万元)
:
![67378dc541a612ba1bc4225fadf99fdf.png](https://img-blog.csdnimg.cn/img_convert/67378dc541a612ba1bc4225fadf99fdf.png)
那么问题来了,给你这样一组数据,或者给你这样一个训练数据的集合,能否预测房屋的面积大小和房价之间的关系?
构建函数
存在如下符号假设:
m 为训练数据 x 为输入特征,即房子的大小 y 为输出结果,即房子的价格 (x, y) 为一个样本,即表格中一行代表一个训练样本i 个训练样本为第
在监督学习中,我们一般会这样做:
- 首先找到一个训练集合
- 提供样本 m 给算法构建学习函数
- 算法会生成一个学习函数,用
表示
- 给学习函数提供足够的样本
,由此输出结果
学习函数
![f8e51f759a5067c43e6e8079dd0912d7.png](https://img-blog.csdnimg.cn/img_convert/f8e51f759a5067c43e6e8079dd0912d7.png)
训练函数
![8875e07a7c6199a71daa5bd76b8bae9e.png](https://img-blog.csdnimg.cn/img_convert/8875e07a7c6199a71daa5bd76b8bae9e.png)
为了设计学习算法(学习函数),假设存在如下函数:
其中
但是影响房子价格的因素不仅仅是房子的大小。除了房子的大小之外,假设这里还知道每个房子的房间数量:
![e7c0eb68f43166e12fa7768a3397c219.png](https://img-blog.csdnimg.cn/img_convert/e7c0eb68f43166e12fa7768a3397c219.png)
那么我们的训练集合将有第二个特征,
假设存在
训练参数
在拥有足够多的训练数据,例如上面的房价数据,怎么选择(学习)出参数
我们把
为了表示两者之间的接近程度,我们可以用训练数据中所有样本的误差的和,所以定义了 损失函数 为:
而最终的目的是为了使误差和
1. 初始化一组向量![]()
2. 不断改变的值使其
不断减小
3. 直到取得最小值,活得得到最优的参数向量
![]()
该搜索算法为 梯度下降,算法的思想是这样的,下图看到显示了一个图形和坐标轴,图像的高度表示误差和
首先随机选取一个点
![5a9db71439bfa3d1bb558fab6f7ef926.gif](https://img-blog.csdnimg.cn/img_convert/5a9db71439bfa3d1bb558fab6f7ef926.gif)
梯度下降的核心就在于每次更新
上面公式代表:
结合
对于存在
学习速率
![4c8f931ab3dce8823f2a1ea3ae6e6b9a.gif](https://img-blog.csdnimg.cn/img_convert/4c8f931ab3dce8823f2a1ea3ae6e6b9a.gif)
代码
选取得到的 150条二手房 数据进行预测和训练,拟合情况如下:
![08c82a5a62f15bc7a56bfbf49a1c3ae3.png](https://img-blog.csdnimg.cn/img_convert/08c82a5a62f15bc7a56bfbf49a1c3ae3.png)
计算损失函数:
# 损失函数
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))
梯度下降函数为:
# 梯度下降函数
def gradientDescent(X, y, theta, alpha, iters):
temp = np.matrix(np.zeros(theta.shape))
parameters = int(theta.ravel().shape[1])
cost = np.zeros(iters)
for i in range(iters):
error = (X * theta.T) - y
for j in range(parameters):
term = np.multiply(error, X[:, j])
temp[0, j] = theta[0, j] - ((alpha / len(X)) * np.sum(term))
theta = temp
cost[i] = computeCost(X, y, theta)
return theta, cost
训练迭代1000次后得到参数
# 训练函数
def train_function():
X, y, theta = get_training_dataset()
# 有多少个x就生成多少个theta
theta = np.matrix(np.zeros(X.shape[-1]))
# 查看初始误差
# first_cost=computeCost(X, y, theta)
# print(first_cost)
# 设置参数和步长
alpha = 0.01
iters = 1000
# 训练得到theta和每一次训练的误差
g, cost = gradientDescent(X, y, theta, alpha, iters)
computeCost(X, y, g)
return g, cost
数据和代码下载请关注公众号【 机器学习和大数据挖掘 】,后台回复【 机器学习 】即可获取