学习报告总结

本文深入探讨了逻辑回归的原理与实现,包括sigmoid函数、损失函数和梯度下降法,并给出了Python代码示例。同时,介绍了蒙特卡洛算法的概念及应用,通过求解圆周率问题展示其基本步骤。内容覆盖了机器学习中的基础算法和随机模拟方法。
摘要由CSDN通过智能技术生成

深度学习 logistic regression

我也是在进行一些学习然后找了一些网络上的例子,具体的大佬们的博客连接我会在最后放上链接。

  1. logistic regression定义

     ​		逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性。例如,估算肿瘤的可能性,录取的可能性。
    
  2. logistic regression的一般过程

    1. 收集数据:任意方法收集数据
    2. 准备数据:数据类型为数值类型(结构化数据格式最佳)
    3. 分析数据:任意方法对数据进行分析
    4. 训练算法:找到最佳的分类回归系数
    5. 测试算法
    6. 主算法
  3. Hypothesis function 假设函数
    g ( z ) = 1 / ( 1 + e − z ) ( 1 ) g(z)=1/(1+e^{-z}) (1) g(z)=1/(1+ez)1
    ​ 从公式(1)看如果𝑧非常大那么 e − z e^{-z} ez将会接近于 0,关于𝑧的 sigmoid 函数将会近似等于 1 除 以 1 加上某个非常接近于 0 的项,因为𝑒 的指数如果是个绝对值很大的负数的话,这项将会 接近于 0,所以如果𝑧很大的话那么关于𝑧的sigmoid 函数会非常接近 1。相反地,如果𝑧非常 小或者说是一个绝对值很大的负数,那么关于 e − z e^{-z} ez会变成一个很大的数,你可以认为这 是 1 除以 1 加上一个非常非常大的数,所以这个就接近于 0。因此当实现逻辑回归时,让机器学习参数𝑤以及𝑏这样才使得 y Λ = w T + b y\Lambda=w^{T}+b yΛ=wT+b成为对𝑦 = 1这一情况的概率的一个很好的估计。因为 g ( z ) g(z) g(z)的图像如下图1.1所示,是一个S形的,取值在[0,1]之间。

    img

    ​ 图1.1

    所以在逻辑回归算法中假设:

    h θ = g ( θ x ) h_\theta=g(\theta x) hθ=g(θx), g ( z ) = 1 / ( 1 + e − z ) g(z)=1/(1+e^{-z}) g(z)=1/(1+ez)其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dV9ZbI6-1619577209055)(https://www.zhihu.com/equation?tex=x)] 是我们的输入, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4FQqLy7R-1619577209063)(https://www.zhihu.com/equation?tex=%5Ctheta)] 为我们要求取的参数。因此,就会有有一个参数向量 θ 0 , θ 1 , θ 2 , . . . , θ n \theta_0,\theta_1,\theta_2,...,\theta_n θ0,θ1,θ2,...,θn,这样 θ 0 \theta_0 θ0就充当了𝑏,这是一个实数,而剩下的 θ 1 \theta_1 θ1 θ n \theta_n θn直到 充当了 ω \omega ω

    1. cost function

      ​ 损失函数又叫做误差函数,用来衡量算法的运行情况。Loss function:𝐿(𝑦^ , 𝑦)。通过损失函数,来衡量预测输出值和实际值有多接近。一般用预测值和实际值的平方差或者是它们平方差的一半,但是通常在逻辑回归中不这么做,因为当在学习逻辑回归参数的时候,会发现的优化目标不是凸优化,只能找到多个局部最优值,梯度下降法很可能找不到全局最优值,虽然平方差是一个不错的损失函数,但是逻辑回归模型中会定义另外一个损失函数:
      L ( y Λ , y ) = − y log ⁡ ( y Λ ) − ( 1 − y ) log ⁡ ( 1 − y Λ ) L(y\Lambda,y)=-y\log(y\Lambda)-(1-y)\log(1-y\Lambda) L(yΛ,y)=ylog(yΛ)(1y)log(1yΛ)

    对于这个逻辑回归损失函数,当𝑦 = 1时损失函数𝐿 = −log(𝑦^), 如果想要损失函数𝐿尽可能得小,那么𝑦^就要尽可能大,因为 sigmoid 函数取值[0,1],所 以𝑦^会无限接近于 1。 当𝑦 = 0时损失函数𝐿 = −log(1 − 𝑦^), 如果想要损失函数𝐿尽可能得小,那么𝑦^就要尽可能小,因为 sigmoid 函数取值[0,1],所 以𝑦^会无限接近于 0。因为目的是让损失函数尽可能小,所以如果𝑦等于 1,我们就尽可能让𝑦^变 大,如果𝑦等于 0,我们就尽可能让 𝑦^ 变小。对于多个向量样本的代价函数,需要这样定以:
    J ( w , b ) = 1 / m ∑ i = 1 m L ( y Λ ( i ) − ( 1 − y ( i ) ) log ⁡ ( 1 − y Λ ( i ) ) ) J(w,b)=1/m\sum^{m}_{i=1}L(y\Lambda^{(i)}-(1-y^{(i)})\log(1-y\Lambda^{(i)})) J(w,b)=1/mi=1mL(yΛ(i)(1y(i))log(1yΛ(i)))

    ​ 损失函数只适用于像这样的单个训练样本,而代价函数是参数的总代价,所以在训练逻 辑回归模型时候,我们需要找到合适的𝑤和𝑏,来让代价函数 𝐽 的总代价降到最低。

    1. 梯度下降法(Gradient Descent)

      ​ 在测试集上,通过最小化代价函数(成本函数)𝐽(𝑤, 𝑏)来训练的参数𝑤和b。通过不同方向不同梯度对代价函数进行不断的迭代寻找最小的值。这就是梯度下降法所实现的意义。

      logistic regression 的代码实现以及运行效果(对于学生是否能考进大学用成绩做一个分类的逻辑回归的小项目 具体内容请看这里https://blog.csdn.net/Arthur_Holmes/article/details/98962345

      • 对数据进行处理,处理成结构化的数据
      def get_X(df):
          #获取特征,并添加x0列向量(全为1)
          ones = pd.DataFrame({'ones':np.ones(df.shape[0])})
          #按axis=1即列合并连接
          data=pd.concat([ones,df],axis=1)
          #按相对位置,获取全部特征值数据(用values是为了得到 np.array)
          return data.iloc[:,:-1].values
      
      • 处理标签值,生成array数组
      def get_y(df):
          #读取标签值
          return np.array(df.iloc[:,-1]) #数据处理转换数组
      
      • 数据归一化处理
      def normalize_feature(df):
          #数据归一化处理
          return df.apply(lambda colum:(colum-colum.mean())/colum.std())
      
      • 实现sigmoid函数
      def sigmoid(z):
          #实现sigmoid函数
          return 1/(1+np.exp(-z))
      
      • 实现代价函数
      def cost(theta,X,y):
          #实现cost function
          first=np.multiply(-y,np.log(sigmoid(X.dot(theta.T))))
          second=np.multiply((1-y),np.log(1-sigmoid(X.dot(theta.T))))
          return np.sum(first-second)
      
      
      • 求梯度
      def gradient (theta,X,y):
          #求梯度
          return X.T @(sigmoid(X @ theta)-y)/len(X)
      
      • 进行梯度下降拟合求参数
      ef gradientDescennt(theta,X,y,alpha,iters):
          #梯度下降拟合参数
          costs=np.zeros(iters)
          temp=np.ones(theta)
          #进行迭代
          for i in range(iters):
              temp = theta-alpha*gradient(theta,X,y)
              theta=temp
              costs[i]=cost(theta,X,y)
          return theta,costs
      
      • 预测数据
      def predict(X,theta):
          return (sigmoid(X @ theta.T)>=0.5).astype(int)#实现变量类型转换
      
      
      • 主函数
      if __name__=='__main__':
          path='datasets/data2wuenda'
          data=pd.read_csv(path,header=None,names=['exam1','exam2','admitted'])
          X=get_X(data)
          y=get_y(data)
          theta=np.zeros(X.shape[1])#返回numpy array 类型 一行三列
          #调用高级的拟合参数,可以试着梯度下降
          res = opt.minimize(fun=cost, x0=theta, args=(X, y), jac=gradient, method='Newton-CG')
          print("res=",res)
          theta_res = res.x#获取拟合的θ参数
          y_pred=predict(X,theta_res)
          print("classification_report(y,y_pred)\n",classification_report(y,y_pred))
          #theta_res,costs = gradientDescennt(theta,X,y,0.00001,500000)
          #先绘制原来的数据
          positive = data[data['admitted']==1]#挑选出录取的数据
          negative = data[data['admitted']==0]#挑选出未被选择的数据
          fig,ax = plt.subplots(figsize=(10,5))#获取绘图对象
      
          # # 对录取的数据根据两次考试成绩绘制散点图
          ax.scatter(positive['exam1'], positive['exam2'], s=30, c='b', marker='o', label='Admitted')
          # 对未被录取的数据根据两次考试成绩绘制散点图
          ax.scatter(negative['exam1'], negative['exam2'], s=30, c='r', marker='x', label='Not Admitted')
      
      
      
          #添加图例
          ax.legend()
          #设置x,y轴的名称
          ax.set_xlable=('Exam1 Score')
          ax.set_ylable=('Exam2 score')
          plt.title("fitted curve vs sample")
          #绘制决策边界
          # print("theta_res = ",theta_res)
          exam_x=np.arange(X[:,1].min(),X[:,1].max(),0.01)
          theta_res = -theta_res/theta_res[2] #获取函数系数θ_0/θ_2 θ_0/θ_2
          #print(theta_res)
          exam_y = theta_res[0]+theta_res[1]*exam_x
          plt.plot(exam_x,exam_y)
          plt.show()
      
      
      • 运行效果,如图1.2所示

    在这里插入图片描述

    ​ 图1.2

    • 运行报告如图1.3所示

在这里插入图片描述

​ 图1.3

蒙特卡罗算法

蒙特卡罗算法定义

​ 蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种概率算法(随机模拟方法),以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。因为是随机算法所以在采样不全时,通常不能保证找到最优解。因此,采样越多,越近似最优解。

蒙特卡洛法求解实际问题的基本步骤
  1. 描述或构造概率过程:对于已有的随机性质问题可描述和模拟这个概率过程,对于不具有随机性质的确定性问题,需要人为地构造一个概率过程。

  2. 利用概率分布抽样:通过计算机产生已知概率分布的随机变量,常用的概率分布有均匀分布,正态分布、指数分布、泊松分布等。

  3. 建立各种估计量:构造了随机概率模型,并从中抽样后,就要确定一个随机变量,作为所要求问题的解。一般是把 次随机抽样结果的算术平均值作为解的近似值

蒙特卡洛法求解,具体实例实现
  • 问题:经典的蒙特卡洛方法求圆周率

  • 基本思想:在图中区域产生足够多的随机数点,计算落在圆内的点的个数与总个数的比值再乘以四,就是圆周率。

  • 总结:蒙特卡洛算法就是随机的产生足够多的点,然后根据产生的点落入所求的区域,以及已知的区域的个数,构建概率。实际问题概率 = 求解区/已知区

  • 代码实现:

import math
import random
Mon=input("输入较大整数!")#产生大量随机点
Start=0
for i in range(int(Mon)):
    X=random.random()  #利用random()产生随机数或者是伪随机数
    Y=random.random()
    if math.sqrt(X**2+Y**2)<1:#判断产生的随机点是否落在单位圆内
        Start=Start+1


pi=4*Start/int(Mon)

print(pi)

  • 蒙特卡洛法常用的例子

    积分的计算,交通堵塞,产品厚度,证券市场。

2)<1:#判断产生的随机点是否落在单位圆内
Start=Start+1

pi=4*Start/int(Mon)

print(pi)
``

图1.4 pi的运行效果
在这里插入图片描述

  • 蒙特卡洛法常用的例子

    积分的计算,交通堵塞,产品厚度,证券市场。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风轻抚杨柳岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值