QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2427|回复: 0
打印 上一主题 下一主题

Logistic回归--实例

[复制链接]
字体大小: 正常 放大

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """7 Z( J# T9 d: q# y7 Q: j( x, p5 O
  2. 函数说明:梯度上升算法测试函数  ]5 n; D, H  t
  3. ) [, t, z9 c9 P( e6 {
  4. 求函数f(x) = -x^2 + 4x的极大值
    4 A9 f. F4 D# R8 y2 r
  5. # D8 F% n- A- I* A8 y. M# j% A: d
  6. Parameters:
    - Y# v3 l2 O# t% U: d' P
  7.     无1 Y9 L4 m$ `; O4 E8 l
  8. Returns:
    7 Z5 M) t; [# S1 f6 b5 x. I
  9.     无
    7 I5 f% W7 M, G5 p$ [* _$ F
  10. """. Z5 c# s% y3 ]
  11. def Gradient_Ascent_test():
    , Q- e5 s: o% G: X
  12.     def f_prime(x_old):                                    #f(x)的导数
    $ b\" O2 r. W: a1 L: a
  13.         return -2 * x_old + 4
    \" p- y& }3 M$ O$ m( V) B5 n
  14.     x_old = -1                                            #初始值,给一个小于x_new的值9 v: e5 P5 ], s( g' j
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始, m! K1 s. ?* e' i5 s, N
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    - m  }# a\" H0 M4 \# b) e1 _
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    ! N: Y+ {% ~( s7 W) K% T( }
  18.     while abs(x_new - x_old) > presision:
    8 L. ]$ K( o% ^8 f
  19.         x_old = x_new
    3 q# V! U, i/ x/ p. S6 t
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式' l( N6 j+ `4 M+ g$ p9 A9 g. r
  21.     print(x_new)                                        #打印最终求解的极值近似值' S, i5 H7 W3 c1 n! H: M' G

  22. 7 \& A/ V5 L, K. [* o
  23. if __name__ == '__main__':9 t4 H5 |+ x\" K7 c2 M
  24.     Gradient_Ascent_test()
    ; x( _' R7 S3 \% W
复制代码
运行实例:
  1. 1.999999515279857
      Y3 }. [* }; E3 J  I  x
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0% d, x\" _7 N4 K0 O7 R: F2 q' J
  2. -1.395634  4.662541  1
    & x& m. E/ G# n% s8 S! @6 o  Y
  3. -0.752157  6.538620  0
    $ s( U; i, n3 h6 g- N
  4. -1.322371  7.152853  04 C; X5 n) q; l& x: ?* l: w
  5. 0.423363  11.054677  01 R4 `, t5 ~6 Z9 n$ q1 S
  6. 0.406704  7.067335  1( S' I  M% K. _4 `
  7. 0.667394  12.741452  0
    5 ^  U; l: H2 j
  8. -2.460150  6.866805  1; c' M/ w! e* P) Q  \5 j% `' B1 z: n
  9. 0.569411  9.548755  01 K( y3 F4 Y. Y& L: k/ C
  10. -0.026632  10.427743  01 z0 g\" K4 ^7 _( ~0 i( l$ Q
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt2 x  a9 m' K' k/ V5 x% h+ r4 ]5 W
  2. import numpy as np
    ( U; d0 ]# V$ _+ Z
  3.   t7 G; x9 u! P7 s  P- Q9 F\" ^
  4. """: i2 r! [3 {5 p# D! L% S
  5. 函数说明:加载数据
    6 O/ n' n: L  L6 z1 t/ J# E8 K
  6. # Y) x% C# B8 P) C  c/ W; l
  7. Parameters:' a$ G- H4 a1 X\" B
  8.     无
    # b( Y# X# x2 K& `5 ~
  9. Returns:
    1 U9 ?% w5 V% B) m& f1 I
  10.     dataMat - 数据列表
    # B/ X& ?& W( P/ R; i7 R3 ?
  11.     labelMat - 标签列表
    / n. ^/ p0 e* Y, G
  12. """& @+ `6 z% N5 a' N/ l3 y
  13. def loadDataSet():
    ' F4 m! P$ w  c4 R
  14.     dataMat = []                                                        #创建数据列表
    9 U; T\" p\" d) k) N% {( @' n- K
  15.     labelMat = []                                                        #创建标签列表4 i6 m' @! X( B
  16.     fr = open('testSet.txt')                                            #打开文件   1 _) S, c3 q6 f' D# I
  17.     for line in fr.readlines():                                            #逐行读取
    8 W8 V5 j+ v3 Q& C
  18.         lineArr = line.strip().split()                                    #去回车,放入列表# Z3 S. }5 F( b2 A' M# s
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据; G2 R% @' B; _* n- ]( N5 A
  20.         labelMat.append(int(lineArr[2]))                                #添加标签+ Z) N2 k( \9 H- H% n1 B
  21.     fr.close()                                                            #关闭文件
    ! h- p! |. z9 l\" V( k- U
  22.     return dataMat, labelMat                                            #返回
    ; |* z* w, a( P  i

  23. % s) y1 d2 L$ w7 I) K3 [- Q
  24. """
    ; K5 V& d1 R, `( ^: w9 n
  25. 函数说明:绘制数据集/ T- X6 }- n, Q
  26. * u\" p8 M( Y8 @' j- e
  27. Parameters:
    9 Z$ e& M! K3 h9 j( s% E. y
  28.     无( Y. M6 Y0 I- n, r\" I# T( Z
  29. Returns:6 v; |  ]' Z5 s7 _
  30.     无
    - n2 M& W# G. @+ A7 _+ N
  31. """
    7 j6 d7 |( ^; Y) w
  32. def plotDataSet():
    - k4 A. s, A- x% Q  I6 E
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集2 k/ x0 B. a, H0 D8 }/ X' _6 h
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    2 M9 y7 L2 `7 L2 i
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    \" v2 n\" |* u: u8 o0 k$ K% A8 ~
  36.     xcord1 = []; ycord1 = []                                            #正样本
    1 _1 W* c5 i7 y/ j$ z+ k
  37.     xcord2 = []; ycord2 = []                                            #负样本- D\" @5 Y2 \) K3 k( b  Q- |
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    - T0 J- @* U9 I6 ]
  39.         if int(labelMat[i]) == 1:
    . s$ P5 m6 ^$ ]& v) f1 z
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    - ~0 \5 p) T% C! x! }
  41.         else:. @: L3 `+ u$ N9 Q. t- F\" Z
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本9 P2 v1 r5 j0 `! _
  43.     fig = plt.figure()
    % R* w! N6 T- k
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    * D, y$ g9 K/ i$ g\" \
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本$ r; J4 S! ?( g3 T% w# O
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    # q2 A% x  U: L! b( K6 W
  47.     plt.title('DataSet')                                                #绘制title
    ; b* W2 @6 e$ @2 w  b
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    - |, e1 K\" S8 X. A5 e
  49.     plt.show()                                                            #显示
    ! q) X2 ?  ~/ T3 Z0 u# d
  50. , l' ?$ s3 n- t3 _\" B
  51. if __name__ == '__main__':, D$ U7 N; k# I, ^
  52.     plotDataSet()
    ' I( p- ?. ], Z4 {' Z& B
复制代码
VeryCapture_20231130171817.jpg + t% E8 ?+ j7 G2 w  U2 H8 r% X
从上图可以看出数据的分布情况。假设Sigmoid函数的输入记为z,那么z=w0x0 + w1x1 + w2x2,即可将数据分割开。其中,x0为全是1的向量,x1为数据集的第一列数据,x2为数据集的第二列数据。另z=0,则0=w0 + w1x1 + w2x2。横坐标为x1,纵坐标为x2。这个方程未知的参数为w0,w1,w2,也就是我们需要求的回归系数(最优参数)。
  1. import numpy as np6 p  X) @3 D- [  c5 |! o- D
  2. ' \. |% I8 i6 ?$ Q
  3. """
    4 m: Y, _: @% I\" V
  4. 函数说明:加载数据
    : D\" L) z! w\" F+ x

  5. 0 v  ?( u\" }( p4 F
  6. Parameters:6 O# u6 H% x8 E5 y( G* w
  7.     无
    5 v; w4 t$ o' t5 b+ p$ ^
  8. Returns:3 W\" r4 a3 k0 |7 ]
  9.     dataMat - 数据列表
    6 S9 l* d4 L  O3 O: x
  10.     labelMat - 标签列表
    ) r( _* E; J, k( D3 C. v
  11. """
    $ P% t4 n7 ^4 {' O& t
  12. def loadDataSet():: ^% j\" G$ R# ^! \% b0 [
  13.     dataMat = []                                                        #创建数据列表6 M2 ]/ ~2 S9 G
  14.     labelMat = []                                                        #创建标签列表\" m4 D  n' ^0 l# K% w
  15.     fr = open('testSet.txt')                                            #打开文件   7 j: S5 z  W) m# T. n( W5 a
  16.     for line in fr.readlines():                                            #逐行读取
    ) ]4 d& O) w! q! [
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    3 w& H3 ^- G- o# u9 Z
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    9 L  Z( F6 p- K5 C( A* {
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    \" {+ y# S0 c8 Q* `$ _) u
  20.     fr.close()                                                            #关闭文件
    4 n8 N' |4 O/ ~& p* d9 y% {
  21.     return dataMat, labelMat                                            #返回
    4 P6 H( n! }0 `

  22. : X3 }9 i: v' `( D  ^
  23. """
    8 e% Y( T3 E& _7 _: R1 a
  24. 函数说明:sigmoid函数
    \" b8 }8 Q4 W9 e6 V& N/ g4 _

  25.   J; t! F5 l6 U' l5 k7 Y8 `2 T
  26. Parameters:; I+ U* R* @+ Q8 d: p& j, y# R$ I
  27.     inX - 数据2 ]% ~\" v8 W9 }& J6 e, S$ I  I' V
  28. Returns:8 R7 H3 m7 {, n0 \; g4 x
  29.     sigmoid函数% l8 }+ Y# G& f* v  p, I3 T
  30. """
    ) q0 a8 B2 p# Y5 J+ T2 ?# a
  31. def sigmoid(inX):% z# W\" C$ @+ ^* C\" C6 a, K
  32.     return 1.0 / (1 + np.exp(-inX))
    1 o; R' C6 Y6 |\" V3 {

  33. * F: u2 |& _# D- w9 `0 i

  34. + z; q0 I9 ?5 O2 d9 O- v8 K
  35. """0 `2 J\" q5 M$ v( |, S\" K7 j2 h4 I, M
  36. 函数说明:梯度上升算法
    \" F/ L- A# }! v
  37. ) d. n2 V+ j: z5 I
  38. Parameters:; e7 ?, r2 _, N6 X
  39.     dataMatIn - 数据集+ O\" X( x\" }1 N6 l3 C
  40.     classLabels - 数据标签
    7 X. a  [0 q4 x6 D; |1 u
  41. Returns:2 Q0 Y4 x# i+ v! S! m
  42.     weights.getA() - 求得的权重数组(最优参数)7 O' g& i: M4 ~, h& u
  43. """
    5 V! v0 g3 F8 u) D) C( t
  44. def gradAscent(dataMatIn, classLabels):7 q; M& E. ]& [0 W\" B8 ]' D! ?% L# [9 o
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat5 z1 N+ L7 @* D) V0 t
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    + e( b0 ?& }- \& t0 Z$ }
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。6 @\" f- C* v9 U& \8 P/ J: V; j
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    ! O3 |\" M5 c( \9 G5 _) Z  m4 t# a7 n
  49.     maxCycles = 500                                                        #最大迭代次数0 S# p3 t5 g: S; G
  50.     weights = np.ones((n,1))7 K- d/ Y0 t3 I5 V; C  w2 q' I
  51.     for k in range(maxCycles):
    0 ^5 [& ^( m& r/ M3 K/ @/ e) y
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式8 v& n# Q2 O3 a8 Q- o
  53.         error = labelMat - h
    # J2 \8 h' p, \
  54.         weights = weights + alpha * dataMatrix.transpose() * error. s! |9 `5 J9 J: r) a0 e
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组8 m& q7 r\" ^+ i& R+ ]

  56. 4 [+ b$ `( ]6 n- Y) v
  57. if __name__ == '__main__':
    ' G' V3 l3 f- W6 a; u1 J1 b* m( g0 j: ^3 l
  58.     dataMat, labelMat = loadDataSet()           
    ! a  S6 j9 b5 D9 ^* t' C+ \3 m
  59.     print(gradAscent(dataMat, labelMat))0 M7 v/ L: o% j( o( \& |  Z
复制代码
运行结果
  1. [[ 4.12414349]
    5 K- P9 C3 f/ a
  2. [ 0.48007329]
    0 W( q* A* Z& s7 y
  3. [-0.6168482 ]]& Q$ B+ }, ~0 [
复制代码

# J& N  J: b  l* N# N' j4 s( K  X
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-8-26 04:16 , Processed in 0.427246 second(s), 53 queries .

回顶部