作者: Sam (甄峰) sam_code@hotmail.com
监督学习下的模型是什么:
x: 输入值或者特征。
y: 输出值或者目标变量。
(x, y):一个数据集。
给定一个训练集(Training Set), 通过学习算法(Learning Algorithm).
获取一个假设函数(Hypothesis).
这个假设函数就是我们训练的成果。 可以给它输入 x(输入变量), 输出一个y(输出变量)
假设函数(Hypothesis)是一个引导从x 到y 函数。
线性回归:
一元线性回归(univariate linear
regression):
也叫作:linear regression with one variable.
当输入变量(属性)只有一个时,把它叫做一元线性回归模型。
为了能够让h(x)所代表的直线能够更好的拟合真实数据,需要找到最好的theta0和theta1.
而什么是最好的参数--theta0和theta1. 就是要让取一组theta0,theta1, 让h(x)与y
整体之间差距最小。换句话说,就是让代价函数最小。(见
机器学习<二>代价函数
)以上就是线性回归模型+二次代价函数
如果采用梯度下降算法来最小化二次代价函数。 则称这个算法为线性回归算法。
如何梯度下降 Cost function J()呢。
例子代码实现:
import numpy as np
import matplotlib.pyplot as plt
#模拟一份线性变化的数据。400个离散点。
# x_data: 400x1 Matrix. y_data: 400x1 Matrix
# 它们的对应项,确定了点的x 和 y 值
x_data = np.linspace(-1.8, 1.8, 400)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape)
bias = 4
y_data = x_data * 3 + bias +
noise
#迭代次数
epochs = 100
#epochs = 1
#学习率
lr = 0.1
#theta给定初始值
Init_theta = [0, 0]
# 假设函数
#输入 theta(theta0, theta1), 和 某一个x 点的x 坐标值
#输出 推导出的y 坐标
def hypothesis(theta, x_dat):
h = theta[0] +
theta[1]*x_dat
return h
#二次代价函数
#输入 theta(theta0, theta1)
#输出 按这个theta算出的误差(代价)值
def Cost_J(theta):
dis = 0
for x, y in zip(x_data,
y_data):
dis += (hypothesis(theta, x) - y)**2
dis =
dis/(2*len(x_data))
return dis
#存储Cost function 结果
J_list = [Cost_J(Init_theta)]
#梯度下降法更新theta
#输入:theta(theta0, theta1) 初始值
#training set 的 X坐标集和Y坐标集
#输出:训练后的theta
def update_theta(theta, X_dat, Y_dat):
up_theta =
theta.copy()
for i in
range(epochs):
theta0_grade = 0
theta1_grade = 0
for j in range(len(X_dat)):
theta0_grade += hypothesis(up_theta, X_dat[j]) - Y_dat[j]
theta1_grade += (hypothesis(up_theta, X_dat[j]) - Y_dat[j]) *
X_dat[j]
up_theta[0] = up_theta[0] - lr * theta0_grade /
len(X_dat)
up_theta[1] = up_theta[1] - lr * theta1_grade /
len(X_dat)
J_list.append(Cost_J(up_theta))
#print(up_theta)
return up_theta
print("Starting theta0 = {0}, theta1 = {1}, error =
{2}".format(Init_theta[0], Init_theta[1],
Cost_J(Init_theta)))
print("Running...")
Init_theta = update_theta(Init_theta, x_data, y_data)
print("After theta0 = {0}, theta1 = {1}, error =
{2}".format(Init_theta[0], Init_theta[1],
Cost_J(Init_theta)))
plt.figure()
plt.scatter(x_data,y_data)
plt.plot(x_data, Init_theta[0] + Init_theta[1] * x_data,
'r')
plt.figure()
plt.plot(J_list)
plt.show()
结果如下:
可以看到,其实40次就收敛了。
Starting theta0 = 0, theta1 = 0, error = [12.88777069] Running... After theta0 = [3.99991926], theta1 = [3.00057397], error = [0.00133854]