QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1188

主题

4

听众

2931

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    2 L$ r. ^- `- g7 [, }) V: H
  2. 函数说明:梯度上升算法测试函数
    3 Q* l) E8 Z9 p6 z3 F3 m! B' q! I

  3. 3 i; _% k1 ^: [: Z. I
  4. 求函数f(x) = -x^2 + 4x的极大值, M$ U  O, g- m2 o1 V, x8 [2 d

  5. 2 t4 I, E+ h# Z% M) `. w
  6. Parameters:( D8 s2 i' B0 ]) U
  7.     无4 c: _2 g+ R, x3 J6 F  h( V
  8. Returns:
    + O5 `, M7 C1 Y4 W0 s1 D9 \
  9.     无
    ' S7 B0 w' w) Q- N- g6 X/ _$ U+ C
  10. """0 w2 ^) z; M6 E4 q( u
  11. def Gradient_Ascent_test():
    9 W8 f8 z6 M# \: m( H- Y
  12.     def f_prime(x_old):                                    #f(x)的导数( P( g! N* X; p0 p) ]  B
  13.         return -2 * x_old + 4
    . C$ _/ m+ n% X
  14.     x_old = -1                                            #初始值,给一个小于x_new的值& C4 B' l. t) H
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始  n8 H0 A8 t. s$ a4 l3 a, U
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度& |4 b8 J0 T. v2 Z: X/ X
  17.     presision = 0.00000001                                #精度,也就是更新阈值8 i$ p4 w) b0 ^- C9 R3 j4 ]
  18.     while abs(x_new - x_old) > presision:4 P% q0 h7 R4 c/ E/ u/ T& F% ]& s
  19.         x_old = x_new
    9 P4 j/ e3 l' e7 p7 y* _# p
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    9 I/ W3 p+ O# K, W/ M. a
  21.     print(x_new)                                        #打印最终求解的极值近似值+ P0 n\" X% `7 O' w1 H/ ~/ z\" r; ^0 b

  22. . X4 V$ }0 h' k5 s. c
  23. if __name__ == '__main__':
    5 u. }0 Z+ j3 C% j! y
  24.     Gradient_Ascent_test()
    2 U0 r  Q/ O- i7 k( h
复制代码
运行实例:
  1. 1.999999515279857* }6 X) v  _4 K- T
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0& i$ I8 `! g2 S8 ~9 @( }; o
  2. -1.395634  4.662541  1
    8 u/ e. X) \1 d9 r
  3. -0.752157  6.538620  0* U! G9 J: q\" x+ f! a
  4. -1.322371  7.152853  0
    ; k! J( T9 @, G2 m
  5. 0.423363  11.054677  0\" R4 c/ _/ v& N
  6. 0.406704  7.067335  19 l2 X0 A7 j% |- U. Q
  7. 0.667394  12.741452  0
    - v  v0 E4 ~+ g0 ^1 {\" q
  8. -2.460150  6.866805  1
    4 W- D, V+ t' C0 S: \5 I
  9. 0.569411  9.548755  0* s9 g& z2 ?- e5 X# r; h
  10. -0.026632  10.427743  0) \\" c- y, E4 e& Z& V
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    \" N8 S/ H0 R$ ^% C
  2. import numpy as np
    6 k& r  n# ?. _. G

  3. 4 }3 p( D% n, b
  4. """
    2 ?  K\" T1 i7 W, j* y0 x
  5. 函数说明:加载数据( b) F( E) R. Q4 ^6 `& s
  6. : w) I; M% d, [7 [\" c: X\" F6 o
  7. Parameters:  U  P2 e: X* G\" y% a6 v- `\" y
  8.     无  q/ M+ z# t, H& m
  9. Returns:4 \  n8 G/ v6 e; z' ]/ x
  10.     dataMat - 数据列表
    . @7 N: W) a\" v: X  |
  11.     labelMat - 标签列表
    ! ^  R\" C% f, j
  12. """' F4 F$ `; W+ y\" ]1 I6 i+ h
  13. def loadDataSet():2 m\" c/ K  x9 Q1 N3 y5 }9 e& @
  14.     dataMat = []                                                        #创建数据列表4 ~1 e4 V. y, F$ F8 V  s
  15.     labelMat = []                                                        #创建标签列表
    * w; K: e8 Q$ L; T, ?' a, h
  16.     fr = open('testSet.txt')                                            #打开文件   
    4 e\" G5 J) N6 C  K. m
  17.     for line in fr.readlines():                                            #逐行读取
    $ Y6 s- }; t, C% D( Y9 H
  18.         lineArr = line.strip().split()                                    #去回车,放入列表# ^. N+ I5 x. F\" p, {  A0 n
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据2 Q- T\" g* \/ y2 L' j8 [3 B6 o! w& y* t
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    ! O6 T* g5 r# S3 d  }
  21.     fr.close()                                                            #关闭文件3 x/ n3 s2 X3 c# A# i' t
  22.     return dataMat, labelMat                                            #返回$ y\" u# U\" o, }( F# Z# |' n

  23. 7 Y9 m: K8 o\" @' }
  24. """6 p) H# }7 y3 v* B; Y
  25. 函数说明:绘制数据集; O, h2 z: H5 F% T% X+ ~# w$ i

  26. : C8 [; Q3 ?3 Z9 L% W2 ^) S+ w6 X
  27. Parameters:& F/ M  e7 _# A9 K\" Z\" T; a
  28.     无5 H$ R2 l1 T5 z7 @* F
  29. Returns:4 w) h2 d0 t) J' }* Q- T\" [
  30.     无8 H9 A( o  t0 h* Q) q
  31. """4 v' T, {# \& U4 D$ x/ w/ A7 L- e
  32. def plotDataSet():; N5 G  [- l0 C! ^  c1 P& h
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集5 ]( I' m3 i\" A  y5 z& W/ i7 k2 |
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
      T3 l6 O, L9 k0 h
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    * [3 J# @7 U) P9 J  i. x5 M  N
  36.     xcord1 = []; ycord1 = []                                            #正样本
    4 K5 R. c$ l% B7 K% x- P. P
  37.     xcord2 = []; ycord2 = []                                            #负样本8 Y  C. U- q4 t2 ]  A& Q: \
  38.     for i in range(n):                                                    #根据数据集标签进行分类, K+ ~/ i, a* T6 M  r0 {
  39.         if int(labelMat[i]) == 1:0 V$ p/ U7 P3 n9 I; l0 f2 O
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本; [' \; H. B8 v7 R$ p' c. U
  41.         else:
    \" l$ o  i5 e2 i6 v* w7 U, G
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    ) s. F6 `- A# x' R7 [
  43.     fig = plt.figure()
    , [; L  b# F/ ?1 E$ i
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    0 ^. l  V* b) L. w. a$ |
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本. s; k. \3 L+ @0 F; L
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
      F* B7 o2 Q+ O6 J$ y' s
  47.     plt.title('DataSet')                                                #绘制title
      F0 \- q) U# f1 E4 a
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label. K, ~( {! r0 U- `6 b/ o+ d+ ?
  49.     plt.show()                                                            #显示$ d  h$ h1 c7 R  ], s# T& q! m

  50. 3 a5 t# V( A/ O8 i* g# L\" H
  51. if __name__ == '__main__':% m3 p3 j- v0 y; O: b* L\" I7 C
  52.     plotDataSet()
    : K* b\" ?$ s+ N/ G& A/ F7 l* ~
复制代码
VeryCapture_20231130171817.jpg " _9 \$ o5 k: R( Z
从上图可以看出数据的分布情况。假设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- y3 f\" u  H5 [

  2. * J$ D) x\" e( X4 Z2 w\" u2 H
  3. """
    ! l9 {) `\" p$ E3 `9 N  r1 P
  4. 函数说明:加载数据
    % |+ B: k$ O1 |- `* R

  5. $ U3 {: |7 r5 l. s8 V
  6. Parameters:6 M2 W* f7 ?) t/ x; A: s
  7.     无
    6 ~3 Q: f# J+ V
  8. Returns:% r' b' T' e1 D+ u2 ?( ?
  9.     dataMat - 数据列表
    9 |8 g5 ^6 m3 F( k3 Y/ I
  10.     labelMat - 标签列表
    , o* E8 ~4 p$ Q\" J, l$ @4 k\" I9 m
  11. """
    ' K; f! g4 s; \- b  u$ y8 Z
  12. def loadDataSet():7 t+ r$ [1 E, T& A2 g1 v
  13.     dataMat = []                                                        #创建数据列表
    * R' A! x/ T\" r  z# B; P* z. l
  14.     labelMat = []                                                        #创建标签列表
    $ }' h1 w, [. V! i
  15.     fr = open('testSet.txt')                                            #打开文件   8 T3 d6 ?4 }( K- H: B
  16.     for line in fr.readlines():                                            #逐行读取
    5 C( H/ O: k7 R4 D% U- ~
  17.         lineArr = line.strip().split()                                    #去回车,放入列表! w; L8 g0 r+ }2 q2 p& _3 K& S\" u
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    ' {& X9 l. E) @  O$ U
  19.         labelMat.append(int(lineArr[2]))                                #添加标签5 u1 B( g+ ?! ~, ^/ G+ Y+ C( P' e
  20.     fr.close()                                                            #关闭文件
    4 \# D9 f/ C. `8 _  k
  21.     return dataMat, labelMat                                            #返回
    2 d( c! M/ u  X. @/ j5 y
  22.   H1 ^4 W$ ~: G  o, h  N
  23. """
    4 o) [+ t. ^# z1 o: m
  24. 函数说明:sigmoid函数
    3 ]2 j( ]5 k, ?# O\" ~2 O
  25. + v9 g! ~% @  R/ `8 g3 x' w
  26. Parameters:
    4 k- P6 y, t& N0 C2 Q2 ?; l2 Y+ r: D
  27.     inX - 数据
    3 A) M$ Z/ J7 z! V
  28. Returns:
    - A7 h, n7 v1 F' _0 n2 D
  29.     sigmoid函数+ Z4 |) B( Y! ?7 R% G. u4 Y
  30. """; ]# [  U& p9 I; @; L+ D+ G( y* Z
  31. def sigmoid(inX):( R: d& S# g\" i9 I
  32.     return 1.0 / (1 + np.exp(-inX))% x2 \7 F* H# R, [6 V; R3 c

  33. 6 B- t5 ~) D- m( k9 ]

  34. $ Q* v9 C7 T9 C  g6 B0 w  H
  35. """
    4 l* j9 z. g7 t0 |/ o( Q& y
  36. 函数说明:梯度上升算法# N( y) a% I- r# [

  37. 9 y: P) x; ?! ^7 J; d$ z
  38. Parameters:\" ]6 r& Q* B1 z/ B* l0 z* _
  39.     dataMatIn - 数据集& `6 l; }0 `$ I6 z# d  x( b4 ^
  40.     classLabels - 数据标签
    & h( x4 v6 b2 S
  41. Returns:
    5 f. ?( K% U- }$ r+ m0 @( e$ L
  42.     weights.getA() - 求得的权重数组(最优参数)  a/ z/ ~  S. o8 r: ?$ \+ Y( E
  43. """\" @: n$ @8 z, ~\" g\" ~4 }' n0 b
  44. def gradAscent(dataMatIn, classLabels):
    4 G9 o6 a7 j* p3 f1 O/ H
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    ( o+ D; x; Y% Z. w$ a- q- U
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置% P, t/ }6 P3 B( w$ f# c0 m
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。\" Z5 V6 }' L' P8 U4 [3 c
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。& V) e& c/ F\" X9 u7 x* b
  49.     maxCycles = 500                                                        #最大迭代次数
    ! ^# q( |9 [7 q9 l\" b) x
  50.     weights = np.ones((n,1))/ Y! b\" n8 g6 c- B. V
  51.     for k in range(maxCycles):8 |6 G! O3 r$ k( a1 V# ]! O
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式( n% W+ Z/ w# x1 m
  53.         error = labelMat - h
    % {  g& v1 J' f' l5 E
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    $ }. o6 o7 B+ s( Q7 \4 E
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组! J6 P. m; P9 x* D, _+ F1 [

  56. & P/ c7 }+ h\" }; y0 w) t\" x& Q
  57. if __name__ == '__main__':
    1 w9 P; g$ I' M+ p9 j  |! ?! Y\" Z
  58.     dataMat, labelMat = loadDataSet()           ( {9 E& q8 y( }* e2 j- ^9 ~
  59.     print(gradAscent(dataMat, labelMat))- h, l1 \2 u; O$ g5 E
复制代码
运行结果
  1. [[ 4.12414349]$ [3 F$ d6 O4 H; b8 e
  2. [ 0.48007329]
    \" ]1 }  M  O& [/ Q* v5 t& Z
  3. [-0.6168482 ]]
    - O: S: T- @. f% Y
复制代码

6 K0 [4 v- b1 C; {- E; w$ N8 g
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-5-26 05:07 , Processed in 0.415758 second(s), 54 queries .

回顶部