QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    9 |' f% d/ c5 R  C2 b  ^
  2. 函数说明:梯度上升算法测试函数# I- G! \0 Z8 ?' S
  3. $ \\" |& o, _2 ]# H! Q
  4. 求函数f(x) = -x^2 + 4x的极大值  \6 G; Z8 C0 L* @* y

  5. ; R\" s  A! c, J/ k6 e/ [/ x
  6. Parameters:
    2 D+ q; l: ]5 W! H: H\" M
  7.     无
    ' g+ ~: g* j! `, O5 I! f2 Q/ r
  8. Returns:. D/ P5 m& h1 d
  9.     无
    0 _. c$ }0 X% b  D
  10. """9 K/ M9 P' x: m, S
  11. def Gradient_Ascent_test():4 `8 B' q; u# e( c% U
  12.     def f_prime(x_old):                                    #f(x)的导数) h; D$ F! U: X/ A5 q3 G( o. k
  13.         return -2 * x_old + 4
    : O+ u+ ~0 t+ ]# ~/ y+ Y7 @: e( u
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    8 p  p\" V- V6 W
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    5 ?* e- U4 [5 q5 G, ?( R6 t
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度- E3 R2 |\" u6 w8 ~' t% ?
  17.     presision = 0.00000001                                #精度,也就是更新阈值$ y' P$ j, ]8 P) T, X
  18.     while abs(x_new - x_old) > presision:
    \" [\" l6 P# ]/ t! ?8 ^
  19.         x_old = x_new
    % ?. y, f: S8 {# V9 I6 `
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式, ~) w- a- o/ }: t4 m' ?
  21.     print(x_new)                                        #打印最终求解的极值近似值
    5 ~7 K# L\" m7 j* b
  22.   j5 m8 q0 G- ?2 g, o% o
  23. if __name__ == '__main__':  _$ |$ ^6 D1 w+ G
  24.     Gradient_Ascent_test()\" t- @: p3 Y\" R( L3 d2 K
复制代码
运行实例:
  1. 1.999999515279857& z6 c\" e4 z8 ~- z# E
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
      C5 n2 y* i8 G
  2. -1.395634  4.662541  1, w, F8 Y! O/ r
  3. -0.752157  6.538620  0' U5 l5 f2 J8 P' ^
  4. -1.322371  7.152853  0
    8 v4 \) ^2 ~' j
  5. 0.423363  11.054677  0
    / Y  _  y) L. d: `  F) {
  6. 0.406704  7.067335  1/ b: E, O( l' S
  7. 0.667394  12.741452  0
    \" e0 M; m$ c! z) ~' l3 h% F
  8. -2.460150  6.866805  13 d: D, W: v# K3 l
  9. 0.569411  9.548755  0* l& {) _% T! y
  10. -0.026632  10.427743  09 E* R* ~\" m1 s( `$ j
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt' O% ^: k. X: I
  2. import numpy as np5 s, w& e% N4 ?# P+ p
  3. $ Y( d4 y4 ?1 X8 J) ^, m
  4. """  Q3 L\" k* |2 F2 R$ X8 ?
  5. 函数说明:加载数据) f* g# V' ?9 C
  6. 0 x9 R/ S/ n! }5 X; ]
  7. Parameters:9 A) e+ z' _- n' i& Y  ~
  8.     无
    0 P* D1 V$ x) M+ I2 Z$ L; q! Q
  9. Returns:
    $ e. W2 p* q* S
  10.     dataMat - 数据列表
    0 ]: w( g: U  {3 Q$ V$ J8 B
  11.     labelMat - 标签列表, n( n/ O% W! B' `! t
  12. """; t3 _, P& S! [1 _8 v\" j
  13. def loadDataSet():
    + P4 ?( N. [9 F* D8 |! Y
  14.     dataMat = []                                                        #创建数据列表
    5 U1 i5 V3 b8 m- x
  15.     labelMat = []                                                        #创建标签列表
    * {' C: s8 [4 A7 S6 Z7 d
  16.     fr = open('testSet.txt')                                            #打开文件   
    ; e- t8 B5 R' l) ~* f* a
  17.     for line in fr.readlines():                                            #逐行读取
    # E, u. @' U' q5 `' b4 N
  18.         lineArr = line.strip().split()                                    #去回车,放入列表4 {5 Q& W# F- y) d
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    . _1 [, g, ^  h# ]  Z: m
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    ' M  ?+ ^6 u% S8 n, \1 b
  21.     fr.close()                                                            #关闭文件+ ?  p, h( x0 W' |
  22.     return dataMat, labelMat                                            #返回
    ! A. `! l) Y% d- k! t) q* w8 J\" A9 W
  23. + I/ I2 ~/ }5 g5 W- f7 U
  24. """+ M3 L. Z6 V3 w& T% h
  25. 函数说明:绘制数据集
    5 m, d\" Y8 O2 e' s. k; n6 z

  26. & @5 |\" F; y! z
  27. Parameters:- |* o- j6 _0 s7 w4 @% \
  28.     无
    8 J6 ~5 r6 b9 T! Q
  29. Returns:
    / m- R) E8 A$ q7 l+ ?) |. X: i
  30.     无
    : F( A) `# V7 w% Y
  31. """
    0 t7 b  B6 n8 J, n2 b
  32. def plotDataSet():
    \" c6 `% G5 K1 ?, A\" t
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集# w# s3 T. ~$ A
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    4 u1 v: }/ s3 w  l) O! k' Y9 }
  35.     n = np.shape(dataMat)[0]                                            #数据个数% B1 E. y% l# R# Q
  36.     xcord1 = []; ycord1 = []                                            #正样本
    2 B* l7 P+ G* x3 i9 c: E+ x- p- N+ ]
  37.     xcord2 = []; ycord2 = []                                            #负样本
    . I* x* j- W# c, W0 O) D9 E
  38.     for i in range(n):                                                    #根据数据集标签进行分类! N- y5 P* y' y
  39.         if int(labelMat[i]) == 1:
    - N4 G3 D( ~% W( i) s& |* ?
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    0 z4 C2 r8 r; C  P
  41.         else:  ]1 d9 W$ \: }6 Z
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    7 k# W) m8 [  o5 j9 J) k$ \
  43.     fig = plt.figure()2 x8 F& S. \+ T- Y: R. l
  44.     ax = fig.add_subplot(111)                                            #添加subplot5 ?0 y\" N\" s8 U* Y3 u  q
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本+ _' i4 n0 e/ p
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
      }! z- I' I# p: r\" i( f) \+ ]
  47.     plt.title('DataSet')                                                #绘制title
    & |+ ?$ g/ J1 O5 V3 R
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    ) _8 E: C% f7 b4 `3 |0 Z
  49.     plt.show()                                                            #显示
    7 D- e& h: j) e# z
  50. 0 e9 Z3 w7 V' u8 B/ A( b
  51. if __name__ == '__main__':( z7 A3 s$ C  F- z/ z; z$ C5 U) p
  52.     plotDataSet()
    5 h+ ~9 h' U' ?7 l% @% s
复制代码
VeryCapture_20231130171817.jpg
9 P  e( ~' U( F. I从上图可以看出数据的分布情况。假设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' d6 F& @- y: \  Z7 Q

  2. 7 h# k5 }% v, H
  3. """
    3 a% V5 W' |8 F& \. Z' s! t
  4. 函数说明:加载数据. p7 ~3 M7 @# D

  5. 7 {9 v$ t: u& d8 X0 m. ]. R
  6. Parameters:
    5 D4 k- |- x2 V$ O% m9 [9 }
  7.     无
    + ]2 {% N; ^* I3 j4 H& K% t
  8. Returns:
    3 k3 c+ H) p; ]\" V! h
  9.     dataMat - 数据列表
    ' C- c# p9 P( c\" B. z. D& ]+ j
  10.     labelMat - 标签列表
    # f9 I3 ?) d# u; [  T7 t2 O
  11. """: o$ h$ E' _5 i! E) H
  12. def loadDataSet():0 v. `8 \/ U% d$ `+ T. w
  13.     dataMat = []                                                        #创建数据列表+ y8 D. ?9 n0 j6 z1 b. V
  14.     labelMat = []                                                        #创建标签列表
    1 H; Q- x& _5 |, w
  15.     fr = open('testSet.txt')                                            #打开文件   
    $ ~: T! q3 h: E, q  e; j0 H# L
  16.     for line in fr.readlines():                                            #逐行读取
    ! t0 V# H2 V3 c  \4 \+ ]0 ^3 {
  17.         lineArr = line.strip().split()                                    #去回车,放入列表: f! v( }+ l; f' P+ x; w$ b- w
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据$ {; b: [$ C$ o
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    ( N8 @) W7 g' F
  20.     fr.close()                                                            #关闭文件
    : \8 x9 Z; x& G' L: v8 f
  21.     return dataMat, labelMat                                            #返回\" D$ N1 H- ?4 V; D  c- _
  22. \" [4 b# Q\" H; ?! b* i* Y5 G. ~. \
  23. """
    ) n  T# s- n0 ~9 \\" e
  24. 函数说明:sigmoid函数% y$ `% b: L  t8 i  x7 c# i$ N2 _% `

  25. 3 p\" i, U6 Z# ^4 Q6 E6 e
  26. Parameters:
    # S1 ?4 a: q5 E/ ~! g, k6 A
  27.     inX - 数据; p# l3 E9 a* U0 ?( J7 k
  28. Returns:( x4 s1 Q! u) y
  29.     sigmoid函数
    8 M) [3 u( U( j! C
  30. """
    * C2 W# w7 D2 W  C
  31. def sigmoid(inX):' w6 ]+ b4 k1 m' J/ R( R
  32.     return 1.0 / (1 + np.exp(-inX))+ N6 N4 z0 S5 Q

  33.   K4 g5 W% E% G' Q
  34. ; h7 x% m5 F) J6 g
  35. """
    1 E+ M( b. ~\" a  S
  36. 函数说明:梯度上升算法
    % D1 W! F7 n# @4 {
  37. , h% u( ^3 B/ D  M5 R$ [9 i
  38. Parameters:
    ! {7 Q! ]+ K% h1 ?
  39.     dataMatIn - 数据集\" X3 [) o* _( l
  40.     classLabels - 数据标签
    # X( B5 |3 S! H  k+ G8 B5 z
  41. Returns:
    0 l2 Y7 t* `& [+ T. @% O
  42.     weights.getA() - 求得的权重数组(最优参数)) W) S) u* ~0 L
  43. """+ ~$ N) G$ x: k0 ^
  44. def gradAscent(dataMatIn, classLabels):6 N5 \% }$ v. |. k& c0 w
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    . r- m5 q7 w0 ?$ a& \
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    / u0 G1 G* n. z$ v  ]
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。$ r4 ?: S: a: e$ z. ~# K2 E
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    ! }+ A! ~/ f$ ~2 [5 G0 j: F. ^
  49.     maxCycles = 500                                                        #最大迭代次数2 x# [. X* n1 |- e
  50.     weights = np.ones((n,1))
    \" i7 p& b3 \& l! E, X5 i1 ~+ w0 g
  51.     for k in range(maxCycles):
    ' A% f3 b: H1 L9 l! T5 Y* J
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    1 Z& S& ^9 c8 R6 v9 f6 `
  53.         error = labelMat - h
    4 S0 [3 I. C& N/ q3 h
  54.         weights = weights + alpha * dataMatrix.transpose() * error3 V! V- L( F/ _& K+ }, G( @7 o
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    % T4 Z: ~# [3 B5 U( A
  56. 8 y3 n( E/ o+ n
  57. if __name__ == '__main__':0 N: O9 Q' E: h1 q
  58.     dataMat, labelMat = loadDataSet()           ! _3 L& V$ k) t5 `& t/ C& B
  59.     print(gradAscent(dataMat, labelMat))
    * l  S: O5 G3 H% ]
复制代码
运行结果
  1. [[ 4.12414349]; Q3 H* i\" M! f/ J
  2. [ 0.48007329]
    ' b5 C2 C( f2 G4 |/ r
  3. [-0.6168482 ]]
    # u1 [* N' r9 W; r& ?\" k' G
复制代码
8 ~3 V4 g9 W1 B0 q1 y! e: L
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-7-10 12:05 , Processed in 0.437312 second(s), 53 queries .

回顶部