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)算法,在某种程度上可缓解这种情况。除了设定明确的循环次数之外,我们也可通过其他方式(例如设定收敛条件等)来终止循环。当梯度小于某个设定值时,表明迭代已经接近函数极值,则退出迭代循环。

相关文章
|
9天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
29 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
20天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
113 66
|
3天前
|
机器学习/深度学习 人工智能 分布式计算
我的阿里云社区年度总结报告:Python、人工智能与大数据领域的探索之旅
我的阿里云社区年度总结报告:Python、人工智能与大数据领域的探索之旅
66 35
|
9天前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
|
24天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
56 20
|
16天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
21天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
48 5
|
20天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
21天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
54 0
|
9天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。

热门文章

最新文章