python实现——梯度下降算法实现线性回归

使用python实现机器算法梯度下降

首先我们要知道梯度算法是用来干什么的?
梯度算法简而言之,用来求最小误差值

利用梯度算法求线性回归

什么是线性回归
线性回归就是能够用一条直线(在一元的情况下)较为精确地描述出数据之间的关系。
**作用:**在新的数据出现时能够预测出相应的值。
这里我们可以举例,我们对房价和房间的大小数据进行线性回归计算,那么我们就可以根据房间大小(X值),代入这个线性方程得出房价(Y值)
这里我们可以举例,我们对房价和房间的大小数据进行线性回归计算,那么我们就可以根据房间大小(X值),代入这个线性方程得出房价(Y值)
知道了线性回归的作用,接下来就是了解如何得到它。
如何实现线性回归计算
得到这个线性方程我们要定义一个假设函数
在这里插入图片描述
通过这个假设函数中,我们已有的数据有 X轴坐标数据,hx就是我们预测出来的Y值。
我们初中的时候就学过Y=kX+b;知道X值我们就可以带入函数得到Y值,这里的k和b就是我们需要通过梯度下降算法求出来的值,
预测值和真实值之间的差距就是误差值,我们就要算出能够得到最小误差值的hx函数。
这里我们引入代价函数
在这里插入图片描述
这个代价代价函数中有hx为预测值,y为真实值,m为数据个数

在这里插入图片描述
求解theta值有两种方式:一.梯度下降法,二.特征方程法

这里展示如何使用梯度下降法的到theta值
梯度下降算法是求解局部最优解的方法,
在这里插入图片描述
公式中:
1.theta需要我们自己随机设定
2.a为学习率
3.代价函数的偏导数如图:
在这里插入图片描述

综上:编程步骤应该为
处理数据集——常见梯度下降算法函数——迭代梯度下降算法函数——打印theta值
代码如下

#读取文件
from numpy import *
file = open("F:\ex1data1.txt")
lines = file.readlines()#逐行读取数据,加入到列表中
m = len(lines)#获得数据数量

#处理数据集
X_data = []
Y_data = []
for i in range(m):
    str=lines[i]
    str1=str.split(',', 1)
    ap_x=float(str1[0])
    ap_y = float(str1[1])
    X_data.append(ap_x)
    Y_data.append(ap_y)

# x的坐标以及对应的矩阵
X_data = array(X_data).reshape(m, 1)
X_1 = ones((m, 1)) 
#reshape作用,改成一个矩阵
X = hstack((X_1, X_data)) #得到一个X轴矩阵
# Y坐标
Y = array(Y_data).reshape(m, 1)
# 学习率
alpha = 0.01


# 代价函数对应的梯度函数,
def gradient_function(theta, X, Y):
    diff = dot(X, theta) - Y
    return (1/m) * dot(X.transpose(), diff)


# 梯度下降迭代
def gradient_descent(X, Y, alpha):
    theta = array([1, 1]).reshape(2, 1)#自定义theta值,
    gradient = gradient_function(theta, X, Y)#梯度下降值
    i=1

    while (i<=1500):#迭代次数
        i=i+1
        theta = theta - alpha * gradient
        gradient = gradient_function(theta, X, Y)

    return theta

#打印theta值
Theta = gradient_descent(X, Y, alpha)
print('Theta0:', Theta[0],'Theta0:',Theta[1])



# 根据数据画出对应的图像
def plot(X, Y, theta):
    import matplotlib.pyplot as plt
    ax = plt.subplot(1,1,1)
    ax.scatter(X, Y, s=30, c="pink", marker="s")
    plt.xlabel("X")
    plt.ylabel("Y")
    x = arange(5.0, 23)  # x的范围
    y = theta[0] + theta[1]*x  #假设函数
    ax.plot(x, y)
    plt.show()




plot(X_data, Y, Theta)

运行结果:
在这里插入图片描述

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值