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实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
25天前
|
监控 算法 安全
深度洞察内网监控电脑:基于Python的流量分析算法
在当今数字化环境中,内网监控电脑作为“守城卫士”,通过流量分析算法确保内网安全、稳定运行。基于Python的流量分析算法,利用`scapy`等工具捕获和解析数据包,提取关键信息,区分正常与异常流量。结合机器学习和可视化技术,进一步提升内网监控的精准性和效率,助力企业防范潜在威胁,保障业务顺畅。本文深入探讨了Python在内网监控中的应用,展示了其实战代码及未来发展方向。
|
4天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
40 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
4天前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
|
5天前
|
监控 算法 安全
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
28 10
|
1月前
|
机器学习/深度学习 人工智能 分布式计算
我的阿里云社区年度总结报告:Python、人工智能与大数据领域的探索之旅
我的阿里云社区年度总结报告:Python、人工智能与大数据领域的探索之旅
115 35
|
23天前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
50 17
|
1月前
|
存储 监控 算法
员工电脑监控屏幕场景下 Python 哈希表算法的探索
在数字化办公时代,员工电脑监控屏幕是保障信息安全和提升效率的重要手段。本文探讨哈希表算法在该场景中的应用,通过Python代码例程展示如何使用哈希表存储和查询员工操作记录,并结合数据库实现数据持久化,助力企业打造高效、安全的办公环境。哈希表在快速检索员工信息、优化系统性能方面发挥关键作用,为企业管理提供有力支持。
45 20
|
27天前
|
存储 人工智能 算法
深度解密:员工飞单需要什么证据之Python算法洞察
员工飞单是企业运营中的隐性风险,严重侵蚀公司利润。为应对这一问题,精准搜集证据至关重要。本文探讨如何利用Python编程语言及其数据结构和算法,高效取证。通过创建Transaction类存储交易数据,使用列表管理订单信息,结合排序算法和正则表达式分析交易时间和聊天记录,帮助企业识别潜在的飞单行为。Python的强大功能使得从交易流水和沟通记录中提取关键证据变得更加系统化和高效,为企业维权提供有力支持。
|
1月前
|
数据采集 Web App开发 数据可视化
Python用代理IP获取抖音电商达人主播数据
在当今数字化时代,电商直播成为重要的销售模式,抖音电商汇聚了众多达人主播。了解这些主播的数据对于品牌和商家至关重要。然而,直接从平台获取数据并非易事。本文介绍如何使用Python和代理IP高效抓取抖音电商达人主播的关键数据,包括主播昵称、ID、直播间链接、观看人数、点赞数和商品列表等。通过环境准备、代码实战及数据处理与可视化,最终实现定时任务自动化抓取,为企业决策提供有力支持。

热门文章

最新文章