python人工智能数据算法(下)(二)

简介: python人工智能数据算法(下)(二)

梯度下降算法


算法简介


梯度下降(Gradient Descent)是一种求局部最优解的优化算法。在求解机器学习算法的模型参数即无约束优化问题,梯度下降是常用方法之一,主要用来递归性地逼近最小误差模型。


方向导数与梯度


在学习梯度下降算法之前,我们需要先了解梯度(Gradient)的概念。在此之前,我们先来回顾一下什么方向导数及其几何意义。


71dbeb7c8a8362fb9e2e262c9e3d2f29_c1003321cf0c45e2b07ada6a6868760d.png


图形解释:


578aaf651fef27c540b7566b886ec95.png


对于导数以及偏导数的定义,均为沿坐标轴正方向函数的变化率。当我们讨论函数沿任意方向的变化率,就引出了方向导数的定义,即某一点在某一方向上的导数值。


梯度下降


梯度下降,又名最速下降(Steepest Descent),是求解无约束最优化问题最常用的方法。它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量。既然在向量空间的某一点处,函数沿梯度正方向具有最大的变化率,那么在优化目标函数的时候,自然是沿着梯度负方向去减少函数值,以此达到我们的优化目标。因为在梯度负方向上目标函数下降最快,这也是最速下降名称的由来。梯度下降法特点为越接近目标值步长越小,下降速度越慢。如图,每一个圈代表一个函数梯度,其中心位置表示函数极值点。每次迭代根据当前位置求得的梯度(用于确定搜索方向以及与步长共同决定前进速度)和步长找到一个新位置,这样不断迭代最终到达目标函数局部最优点(如果目标函数是凸函数,则到达全局最优点)。


1ca6c402f835e73749d0714276e31d4b_caa6674e99ee4c3f95ff6744e9b5701c.png


上述梯度下降过程可描述为一个函数自变量的迭代过程,用一个数学公式描述如下:

β=β-α·▽J(o)

其中,J为关于o的函数,β为当前所处位置,从该位置沿着下降最快的方向,即为梯度负方向-▽j(o),移动前进至β(i+1),α为每次的移动步长。重复该步骤直至抵达函数J的极值点。梯度下降中的α在机器学习中也被称为学习率(Learning Rate)或步长,通过α来控制每一步的距离,既要保证不让步长大大错过最低点,也要保证让步长太小而导致学习速度过慢而影响整体效率。


5d01237374b265df4a80889807c7369a_17c6127f7d164fc4b36cb24c1f97adbd.png


基于梯度下降算法的线性回归


在统计学中,线性回归(Linear Regression)是利用线性回归方程对一个或多个自变量与因变量之间的关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。在回归分析中,只包含一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析包含两个或两个以上的自变量,且因变量和自变量之间存在线性关系,则称为多元线性回归分析。

一元线性回归分析,简而言之,就是通过给定的一系列数据点,求出符合这些点的最佳直线方程。假设有如图的一组数据点,我们要找到一条合适的直线来拟合这些数据。为此,我们将使用标准的y=mx+b直线方程,其中m为直线的斜率(Slope),b为直线的y轴截距(Intercept)。想要找到最佳的数据拟合直线,只需找到m与b最佳的值即可。


4ac7551844caadbab3575449798f2e85_a6eb74dc3b394be09e8f3fbe9a3afb3d.png


解决这类问题的标准方法是,首先定义一个误差函数,亦可称为代价函数或成本函数(Cost Function),用于评估函数与数据点之间的拟合程度。误差函数的值越小,代表模型拟合程度越好。该函数以(m,b)为输入,并根据模拟数据点与直线的匹配程度返回一个误差值。为了计算给定直线的误差,我们将遍历给定模拟数据集中的每个数据点(x,y),并求出每个点的y值与候选直线y值之间的平方距离(Square Distance)之和。误差函数可定义如下:

示例代码:


def error_function(b,m,points):
    totalError=0
    for i in range(0,len(points)):
        x=points[i][0]
        y=points[i][1]
        totalError+=(y-(m*x+b))**2
    return totalError/float(len(points))


07b3dcaa4b083a7bfbfc7530e1c4f894_f73bcf640a8e493683d32d416fc0df11.png


现在我们就可以进行接下来执行梯度算法,梯度下降算法实现的示例代码如下:



def step_gradient(m_current,b_current,points,learningRate):
    '''
    梯度下降算法核心方法
    参数说明
    m_current:当前斜率值m
    b_current:当前截距值b
    points:模拟数据点集合
    learningRate:学习率,也是每次移动的步长
    '''
    b_gradient=0 #erro函数关于b的偏导数
    m_gradient=0 #erro函数关于m的偏导数
    N=float(len(points)) #数据集长度
    #通过梯度下降计算更新后的m与b值
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        #erro函数对b求偏导数
        b_gradient+=-(2/N)*x*(y-((m_current*x)+b_current))



学习率变量控制在每次迭代中“走下坡路”的幅度.为确保梯度下降正常工作的最好方式是确保每次迭代的误差持续递减。

基于上述定义的误差函数和梯度计算方法,就可以通过多次梯度下降算法来获取最佳拟合直线的斜率m和截距b。示例代码如下:



from numpy import *
def gradient_descent_runner(points,starting_b,starting_m,learning_rate,num_iterations):
    '''
    定义梯度下降运行方法
    points:模拟数据点集合
    starting_b:初始化b值
    starting_m:初始化m值
    learningRate:学习率,也是每次移动的步长
    num_iterations:迭代次数
    '''
    b=starting_b #初始化b值
    m=starting_m
    b_m_sets=[] #用于存放所有拟合直线的m,b值
    #梯度下降算法迭代
    for i in range(num_iterations):
        b,m=step_gradient(b,m,array())
        b_m_sets.append([b,m])
    #返回所有拟合直线的m,b值
    return b_m_sets
def run():
    '''
    定义主程序
    读取本地文件,设置本地曲线
    通过多次梯度下降算法迭代来获取最佳拟合直线的斜率m与截距b
    '''
    points=genfromtxt('data.csv',delimiter=',')
    learning_rate=0.0001
    initial_b=0 #初始化b值
    initial_m=0 #初始化m值
    num_iterations=100 #迭代次数
    print("Starting gradient descent at b={0},m={1},error={2}".format(initial_b,initial_m,error_function(initial_b,initial_m,points)))
    #通过梯度下降算法获取拟合直线的m,b值
    parameters=gradient_descent_runner(points,initial_b,initial_m,learning_rate,num_iterations)
    [b,m]=parameters[-1]
    print('After {0} iterations b={1},m={2},error={3}'.format(num_iterations,b,m,error_function(b,m,points)))
    # 可视化输出数据点,最佳拟合直线以及误差梯度下降曲线
    gd_visualization(points,parameters,num_iterations)
    def gd_visualization(points,parameters,iter_num):
        xx=[]
        yy=[]
        for i in range(len(points)):
            xx.append(points[i][0])
            yy.append(points[i][1])
        plt.plot(xx,yy,'bo',label='模拟数据点')
        plt.title('一元线性回归分析示例')
        plt.xlabel('x')
        plt.ylabel('y')
        plt.grid(False)
        [b,m]=parameters[-1]
        x=np.linspace(0,100,100)
        y=m*x+b
        plt.plot(x,y,'r-',label='最佳拟合直线')
        plt.legend()
        plt.show()
        erro=[]
        for j in range(len(parameters)):
            [b,m]=parameters[j]
            erro.append(error_function(b,m,points))
        iteration=range(iter_num)
        plt.plot(iteration,erro,'b--',label='误差函数梯度下降函数')
        plt.xlabel('迭代次数')
        plt.ylabel('误差')
        plt.legend()
        plt.show()
if __name__=='__main__':
    run()


274ae6f0049f337a38d28a9e28d8e0bb_d85987a26e02488980b280ffbadd12fd.png


8618267708ec62c089897a4591f74d3c_d960fb8652374bd4be16fbd6623af590.png


算法总结


在线性回归问题中,一般只有一个极小值。我们定义的误差函数为凸曲线。因此无论从哪里开始,最终都会到达绝对最小值。一般来说,并非所有情况皆如此,有些函数可能存在局部极小值,普通的梯度下降搜索则有可能会陷入其中,而通过随机梯度下降(Stochastic Gradient Descent,SGD)算法,在某种程度上可缓解这种情况。除了设定明确的循环次数之外,我们也可通过其他方式(例如设定收敛条件等)来终止循环。当梯度小于某个设定值时,表明迭代已经接近函数极值,则退出迭代循环。

相关文章
|
14天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
69 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
24天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
118 66
|
5天前
|
存储 监控 算法
员工电脑监控屏幕场景下 Python 哈希表算法的探索
在数字化办公时代,员工电脑监控屏幕是保障信息安全和提升效率的重要手段。本文探讨哈希表算法在该场景中的应用,通过Python代码例程展示如何使用哈希表存储和查询员工操作记录,并结合数据库实现数据持久化,助力企业打造高效、安全的办公环境。哈希表在快速检索员工信息、优化系统性能方面发挥关键作用,为企业管理提供有力支持。
35 20
|
5天前
|
数据采集 Web App开发 数据可视化
Python用代理IP获取抖音电商达人主播数据
在当今数字化时代,电商直播成为重要的销售模式,抖音电商汇聚了众多达人主播。了解这些主播的数据对于品牌和商家至关重要。然而,直接从平台获取数据并非易事。本文介绍如何使用Python和代理IP高效抓取抖音电商达人主播的关键数据,包括主播昵称、ID、直播间链接、观看人数、点赞数和商品列表等。通过环境准备、代码实战及数据处理与可视化,最终实现定时任务自动化抓取,为企业决策提供有力支持。
|
14天前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
|
21天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
25天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
20天前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
25天前
|
存储 机器学习/深度学习 人工智能
科技云报到:人工智能时代“三大件”:生成式AI、数据、云服务
科技云报到:人工智能时代“三大件”:生成式AI、数据、云服务
|
16天前
|
机器学习/深度学习 人工智能 运维
人工智能在事件管理中的应用
人工智能在事件管理中的应用
65 21