QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    8 l& f; u% `& ^! a- P0 n
  2. 函数说明:梯度上升算法测试函数
    : I4 C( o  {/ |2 i8 J! e$ g  I# \/ P

  3. % R  [  d6 B. e4 j3 F& \; |
  4. 求函数f(x) = -x^2 + 4x的极大值
    4 }\" `, v1 w- @0 f* u: @\" H( Y

  5. \" B- e7 z( ]6 L4 X, N4 l
  6. Parameters:
    5 r/ ^1 Q8 I) X' }+ y; {! I. |+ D
  7.     无* [7 t9 c! @4 k0 ~: |# Y6 B
  8. Returns:2 {( E* j* Q+ ]! d1 h
  9.     无7 `+ ^: \( J4 L5 b3 C
  10. """
    2 X8 F, U  J- o2 Q5 w2 Z7 K
  11. def Gradient_Ascent_test():2 j2 H, s# Y! m. E0 G; E
  12.     def f_prime(x_old):                                    #f(x)的导数
    3 V6 h2 x* h# T
  13.         return -2 * x_old + 4
    7 w* L' w% d9 X$ J
  14.     x_old = -1                                            #初始值,给一个小于x_new的值, S/ O1 c; |0 w0 p
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始: L' L% {+ \1 x8 w/ Y3 x
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度* |- {5 c6 A% q! S
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    3 v3 C0 }3 W  |8 r, b- o5 e, U
  18.     while abs(x_new - x_old) > presision:, [+ ^) ?) }' J4 k. o
  19.         x_old = x_new
    : k1 ]0 q$ c2 l1 z# ?8 X+ A3 T
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    ; C5 k* W6 X- E/ a0 ?' h
  21.     print(x_new)                                        #打印最终求解的极值近似值
    & G$ d9 q! Q5 D( L2 y
  22. 9 h( y0 n$ N& x* O% d% U5 `- E6 D% e
  23. if __name__ == '__main__':
    & [% U9 `* q  i. n# c
  24.     Gradient_Ascent_test()
    ; u4 I: k$ w/ J8 m' c, B* ?- k% b
复制代码
运行实例:
  1. 1.999999515279857+ ]3 l$ r6 W; j3 M4 T  d
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
    # y\" ?) c# \- {/ q' A/ z
  2. -1.395634  4.662541  1
    0 z0 _% m4 ?: ^& ?1 A& H# J9 d& O' ]
  3. -0.752157  6.538620  0) A2 X* d  Z+ e
  4. -1.322371  7.152853  0
    : d+ f( v* e; H: ~6 z7 g! a4 Z7 i5 M5 \! O
  5. 0.423363  11.054677  0: f  x3 Q4 M! }\" Y- ^7 F- o* d+ Y
  6. 0.406704  7.067335  1
    , F8 Y% W* F& T* i
  7. 0.667394  12.741452  0  {' O) O  {4 S0 z' U
  8. -2.460150  6.866805  1
    + L+ o$ h6 z; a' L' _+ I6 a9 O! J$ t' A
  9. 0.569411  9.548755  0: A1 B) P. X6 F+ v4 C  i$ O
  10. -0.026632  10.427743  04 M+ s& i; a) h\" m
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    $ J- R& ], g4 A. \
  2. import numpy as np; [# |( E* _& ]. b4 ?

  3. + d* Y; |3 C) x  w  n+ Y# C
  4. """
    0 \! U, X! |5 Z
  5. 函数说明:加载数据6 c, R. N1 ?& W4 T& p& `; `' R

  6. $ r  h\" ]. ^( U- ^; s- i& X  }4 p
  7. Parameters:. M- G4 M( X7 U3 q  A  a
  8.     无; S5 H7 s8 x$ c6 }
  9. Returns:
    ( p4 O\" s# v' a* U& S, C
  10.     dataMat - 数据列表2 n  a8 K! ~2 U  Q! L
  11.     labelMat - 标签列表
    ; d3 O0 {1 T% X* C  P0 ~
  12. """7 y! B0 Y! \: E4 @
  13. def loadDataSet():
    2 L  h2 L- p; r2 k9 s
  14.     dataMat = []                                                        #创建数据列表7 w7 w\" V3 a7 E5 V7 P% Z3 g1 m! M
  15.     labelMat = []                                                        #创建标签列表6 q  W  @  N* ~3 b6 |0 X4 u
  16.     fr = open('testSet.txt')                                            #打开文件   / r! w3 {  `- A/ @# v1 @
  17.     for line in fr.readlines():                                            #逐行读取
    7 w# [: T2 w# T0 r$ c0 O: h0 o
  18.         lineArr = line.strip().split()                                    #去回车,放入列表3 t7 b\" _5 t9 ~6 b5 Z, y
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据# m8 o) K, j- y$ p6 O
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    4 s$ p. K5 X\" C5 k+ B
  21.     fr.close()                                                            #关闭文件/ A- o# a( J' h* V
  22.     return dataMat, labelMat                                            #返回3 }. U: G3 n. a* p
  23. , c4 g, ?2 i# ?% I5 X2 b
  24. """* q' i- K! N  L' J  \
  25. 函数说明:绘制数据集5 V0 V! G  i8 G5 q( U- q  J

  26. ; m- Z: v2 v* C4 n/ B+ z
  27. Parameters:2 u% [* h+ F2 c% V\" ~- f' U
  28.     无, v9 O6 f! _, {$ V/ [8 H
  29. Returns:5 m; r  I# g; R9 N
  30.     无
    2 r2 y7 q9 g4 h# \/ M& ^* w
  31. """
    ! n. _! x7 e6 f# {+ v
  32. def plotDataSet():
    $ x3 `3 i/ q* q: P) ^0 n% r( @. L4 F
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    \" ^\" Z. c& W4 p$ Z5 I
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    \" p$ R, ]4 W3 I; j
  35.     n = np.shape(dataMat)[0]                                            #数据个数9 |4 j7 U# a& {, ~$ ]+ {9 P, W
  36.     xcord1 = []; ycord1 = []                                            #正样本
    9 z1 G4 p% H; X8 e7 O% Q* ^
  37.     xcord2 = []; ycord2 = []                                            #负样本
    . o9 Z8 H5 X6 Y+ a
  38.     for i in range(n):                                                    #根据数据集标签进行分类% r5 j: J& P  f6 A8 j: o# ?
  39.         if int(labelMat[i]) == 1:
    ) [! V  V# h& `\" B# J
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    \" p\" g6 y' S2 H$ D
  41.         else:5 c, W) v+ Z% }4 {\" O* C
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本6 Y( g& S0 a* x2 u. f/ T0 U
  43.     fig = plt.figure()9 `3 T# X# |8 X6 I
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    / x8 k6 a0 @' p9 k4 m. {1 Q$ M4 G
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    8 t6 ^4 T, l- y9 L8 x) R
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本1 D4 E! v\" Y2 c4 @$ i5 M/ x7 S
  47.     plt.title('DataSet')                                                #绘制title: v) y( I, ^+ Z/ {6 C+ @/ U9 D
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label- ^- U- A$ B0 n# i
  49.     plt.show()                                                            #显示
    7 A\" V1 a' W$ m3 X5 {: V( z

  50. * {\" H% x\" I1 X7 ?
  51. if __name__ == '__main__':' O6 m1 v4 R9 a\" |& W# \: e: F) ^3 }9 N, x
  52.     plotDataSet(); C; x5 r9 d- a6 m
复制代码
VeryCapture_20231130171817.jpg - X% l1 [6 `% g
从上图可以看出数据的分布情况。假设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 np; Q& ^6 n0 y. C4 W5 R. g
  2. ! q  e- [# ~: @* Y* k! S5 {2 I
  3. """
    1 s8 M/ E5 P2 P- N3 k7 m
  4. 函数说明:加载数据9 j- v. k% M1 n1 W2 \* D
  5. \" S6 e8 y) r! j; x, T, O0 q3 t
  6. Parameters:8 l- U/ g7 [2 ^1 m0 F5 w/ D, I
  7.     无
    8 }( {0 Y1 T5 ^  V: k
  8. Returns:( u) d; B. u+ _7 Q2 `9 A
  9.     dataMat - 数据列表/ g) A% K( w2 ^
  10.     labelMat - 标签列表; @; ?5 `0 W: I4 A5 |7 F
  11. """4 ]  A( D$ g9 G2 ~+ J5 z; [- X/ Q% J
  12. def loadDataSet():4 w$ _8 J! C$ ~  }* `, F
  13.     dataMat = []                                                        #创建数据列表
    6 Y( P& ?$ n4 W* ~) _1 o' w  d4 l# F
  14.     labelMat = []                                                        #创建标签列表
    ; v/ d1 E# G1 a
  15.     fr = open('testSet.txt')                                            #打开文件   
    3 u; W3 q  v. n+ J  k' B$ Q, r. A
  16.     for line in fr.readlines():                                            #逐行读取
    % w- Q\" i7 v/ g4 r0 w# j
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    \" d/ h. T/ q0 A  j* p
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    1 i2 f5 o0 R' t+ ]
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    $ [\" k, C% O% }
  20.     fr.close()                                                            #关闭文件( w3 V# h; Q8 L  f; v; v( ]% e$ }
  21.     return dataMat, labelMat                                            #返回2 z! p& w+ ^$ w( _  q- G
  22. 1 {$ D\" H, M* X! l- C
  23. """
    9 K$ r# Z# d- _9 _
  24. 函数说明:sigmoid函数2 x5 A  j$ N# |& y/ {/ `

  25. . ^% j3 x4 ^/ X% ~* |, w: B
  26. Parameters:2 U  `7 [0 B1 d
  27.     inX - 数据1 i: x) D/ K$ {7 V4 X. N
  28. Returns:
    5 h1 _\" V\" R8 Z6 C
  29.     sigmoid函数
    \" P) @: m* i2 y( @) w( c9 |# r! i
  30. """
    1 I* v3 M& D' F& Y
  31. def sigmoid(inX):
    / r0 S0 U  P5 t7 h; N$ W
  32.     return 1.0 / (1 + np.exp(-inX))
    $ g$ ~# {! {- q& `' C5 `6 S

  33. , c% c- @' Y) H/ W+ C
  34. 7 K( W, x7 u9 Z6 O1 x
  35. """0 E, J1 O' l8 U$ N, v. a
  36. 函数说明:梯度上升算法6 {0 b2 H0 m7 E% Y1 s
  37. , {& M' `5 h4 b! M$ f+ l
  38. Parameters:: w\" d9 w* O, G
  39.     dataMatIn - 数据集
    ( I7 C& u' P1 f6 ]. e
  40.     classLabels - 数据标签) i. b  b. [3 |( J; O
  41. Returns:
    % I4 D6 X) }# H3 T& D9 d
  42.     weights.getA() - 求得的权重数组(最优参数)* H8 h4 t, s; V( A; v
  43. """
    4 B8 V8 T$ j* Y/ `3 O
  44. def gradAscent(dataMatIn, classLabels):
    3 P8 z( F' x  `0 [
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat2 T9 Q' K6 R# G! k5 c. V
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    ! w% A  y, q- n3 I+ f
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    1 r( _: |. h( G\" O
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。. K* h, h9 \6 u8 F& P/ O+ p5 q0 l
  49.     maxCycles = 500                                                        #最大迭代次数
    / T7 O( l6 |1 r& p  O7 V% B( x
  50.     weights = np.ones((n,1))
    - [9 T/ g/ j  ?' m9 `1 v
  51.     for k in range(maxCycles):& e6 k$ z5 M* c5 S\" H
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式. a; j\" m2 P9 ?$ l3 U! Y5 x5 @
  53.         error = labelMat - h9 j3 E$ k0 U2 J) F  f% b
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    1 g! \2 C+ {- I7 k
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    5 ~/ P5 Q7 z* [& @* Y2 X* Y
  56. , X) J2 W# {) N0 Z8 x
  57. if __name__ == '__main__':
    1 Y, w; E1 G& s  ~, t. g
  58.     dataMat, labelMat = loadDataSet()           : J4 s/ T( e- }
  59.     print(gradAscent(dataMat, labelMat))
    ( _  M\" _  I5 {$ b; \# C: B
复制代码
运行结果
  1. [[ 4.12414349]6 z' @; d$ X7 j& d! Y\" c0 ]\" t  x
  2. [ 0.48007329]
    9 E% {2 Y1 B* {; d) T
  3. [-0.6168482 ]]
    ' f, k5 A7 G% C3 W8 E\" a0 I
复制代码
) M' b$ H7 W( t# Y3 M7 T% {
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-25 22:00 , Processed in 0.580077 second(s), 54 queries .

回顶部