Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

机器学习线性回归一

$
0
0
作者: 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]


 

Viewing all articles
Browse latest Browse all 158

Trending Articles