机器学习入门:线性回归及梯度下降

 
本文会讲到:

(1)线性回归的定义

(2)单变量线性回归

(3) cost function:评价线性回归是否拟合训练集的方法
(4) 梯度下降:解决线性回归的方法之一
(5) feature scaling:加快梯度下降执行速度的方法

(6)多变量线性回归


Linear Regression
 
 
注意一句话:多变量线性回归之前必须要Feature Scaling!

方法:线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个线性函数,然后测试这个函数训练的好不好(即此函数是否足够拟合训练集数据),挑选出最好的函数(cost function最小)即可;
注意:
(1)因为是线性回归,所以学习到的函数为线性函数,即直线函数;
(2)因为是单变量,因此只有一个x;

我们能够给出单变量线性回归的模型:
 
 
我们常称x为feature,h(x)为hypothesis;

从上面“方法”中,我们肯定有一个疑问,怎么样能够看出线性函数拟合的好不好呢?
我们需要使用到Cost Function(代价函数),代价函数越小,说明线性回归地越好(和训练集拟合地越好),当然最小就是0,即完全拟合;

举个实际的例子:

我们想要根据房子的大小,预测房子的价格,给定如下数据集:

 

 

根据以上的数据集画在图上,如下图所示:

我们需要根据这些点拟合出一条直线,使得cost Function最小;


虽然我们现在还不知道Cost Function内部到底是什么样的,但是我们的目标是:给定输入向量x,输出向量y,theta向量,输出Cost值;

以上我们对单变量线性回归的大致过程进行了描述;


Cost Function


Cost Function的用途:对假设的函数进行评价,cost function越小的函数,说明拟合训练数据拟合的越好;
下图详细说明了当cost function为黑盒的时候,cost function 的作用;
 

但是我们肯定想知道cost Function的内部构造是什么?因此我们下面给出公式:
 
其中:
表示向量x中的第i个元素;
表示向量y中的第i个元素;
表示已知的假设函数;
m为训练集的数量;

比如给定数据集(1,1)、(2,2)、(3,3)
则x = [1;2;3],y = [1;2;3]     (此处的语法为Octave语言的语法,表示3*1的矩阵)
如果我们预测theta0 = 0,theta1 = 1,则h(x) = x,则cost function:
J(0,1) = 1/(2*3) * [(h(1)-1)^2+(h(2)-2)^2+(h(3)-3)^2] = 0;
如果我们预测theta0 = 0,theta1 = 0.5,则h(x) = 0.5x,则cost function:
J(0,0.5) = 1/(2*3) * [(h(1)-1)^2+(h(2)-2)^2+(h(3)-3)^2] = 0.58;


如果theta0 一直为 0, 则theta1与J的函数为:
 
如果有theta0与theta1都不固定,则theta0、theta1、J 的函数为:
 

当然我们也能够用二维的图来表示,即等高线图;
  • 106
    点赞
  • 336
    收藏
    觉得还不错? 一键收藏
  • 43
    评论
线性回归机器学习中的一种基本算法梯度下降法是线性回归中常用的优化算法。下面是线性回归梯度下降法的实现步骤: 1.读取数据集,包括自变量和因变量。 2.初始化相关参数,包括学习率、迭代次数、截距和斜率等。 3.定义计算代价函数,常用的代价函数是均方误差(MSE)。 4.梯度下降,通过不断迭代更新截距和斜率,使得代价函数最小化。 5.执行梯度下降算法,得到最优的截距和斜率。 下面是Python代码实现: ```python import numpy as np # 读取数据集 def load_data(file_path): data = np.loadtxt(file_path, delimiter=',') x_data = data[:, :-1] y_data = data[:, -1] return x_data, y_data # 初始化相关参数 def init_params(): b = 0 k = 0 learning_rate = 0.01 num_iterations = 1000 return b, k, learning_rate, num_iterations # 定义计算代价函数 def compute_cost(b, k, x_data, y_data): total_error = 0 for i in range(len(x_data)): total_error += (y_data[i] - (k * x_data[i] + b)) ** 2 cost = total_error / float(len(x_data)) return cost # 梯度下降 def gradient_descent(b, k, x_data, y_data, learning_rate, num_iterations): m = float(len(x_data)) for i in range(num_iterations): b_gradient = 0 k_gradient = 0 for j in range(len(x_data)): b_gradient += (1/m) * ((k * x_data[j] + b) - y_data[j]) k_gradient += (1/m) * ((k * x_data[j] + b) - y_data[j]) * x_data[j] b = b - (learning_rate * b_gradient) k = k - (learning_rate * k_gradient) return b, k # 执行梯度下降算法 def linear_regression(file_path): x_data, y_data = load_data(file_path) b, k, learning_rate, num_iterations = init_params() print("Starting parameters: b = {0}, k = {1}, cost = {2}".format(b, k, compute_cost(b, k, x_data, y_data))) b, k = gradient_descent(b, k, x_data, y_data, learning_rate, num_iterations) print("After {0} iterations: b = {1}, k = {2}, cost = {3}".format(num_iterations, b, k, compute_cost(b, k, x_data, y_data))) # 调用线性回归函数 linear_regression('data.csv') ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值