python实现——梯度下降算法实现线性回归
使用python实现机器算法梯度下降
首先我们要知道梯度算法是用来干什么的? 梯度算法简而言之,用来求最小误差值
利用梯度算法求线性回归
什么是线性回归: 线性回归就是能够用一条直线(在一元的情况下)较为精确地描述出数据之间的关系。 **作用:**在新的数据出现时能够预测出相应的值。 这里我们可以举例,我们对房价和房间的大小数据进行线性回归计算,那么我们就可以根据房间大小(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)
运行结果:
上一篇:
通过多线程提高代码的执行效率例子