QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    ) d2 U, Q' c( t* D; @, B& c: c
  2. 函数说明:梯度上升算法测试函数
    . \' @) a3 K0 R# d4 r6 W

  3. ) r( s$ B8 U' c) N$ A! \( G/ H! H
  4. 求函数f(x) = -x^2 + 4x的极大值) p2 V: M2 @& A- n) o

  5. , W0 ]\" r. O' h9 v6 H0 y$ E* G/ J
  6. Parameters:
      `6 S1 q7 I' U0 t- N4 ?& `' b' Z
  7.     无+ D' y: V# M0 ~' ]# W7 T* H
  8. Returns:. X2 g8 a* v$ P$ a' u8 ~( e5 {
  9.     无- T% v6 T: R( A\" H8 e( P. N
  10. """
    5 g) r2 I8 Y8 ~* y$ Y* m  Z: S9 K
  11. def Gradient_Ascent_test():
    , Q- U. z- x3 S5 W5 Z
  12.     def f_prime(x_old):                                    #f(x)的导数1 C) G& N, R- `6 }. @
  13.         return -2 * x_old + 4, w4 Z! u- L! E% |. z0 j
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    \" N\" @\" g( {6 M1 r2 Z/ z+ F: E, `
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    , V& H+ E/ E5 Z( e2 X. T
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    1 [, }: F( I3 }1 d) k0 ?! o' j
  17.     presision = 0.00000001                                #精度,也就是更新阈值* ?% d3 T3 \5 A9 e
  18.     while abs(x_new - x_old) > presision:0 n0 \4 u+ a8 l. ]2 ]
  19.         x_old = x_new: E- J6 w0 z9 t9 @* e
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    0 b- d0 u+ i3 F% N
  21.     print(x_new)                                        #打印最终求解的极值近似值
    . {$ O4 Y' g- p* M& P& K3 l9 S

  22. ( P2 P1 z& a( y: f
  23. if __name__ == '__main__':
    # F4 F0 l. O# r\" i/ S
  24.     Gradient_Ascent_test()/ q1 b+ V; x1 V2 e$ f6 S! p
复制代码
运行实例:
  1. 1.999999515279857$ Y# e\" j' O2 e3 ?5 B! a
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0: `- E/ U6 C) O% E! V
  2. -1.395634  4.662541  1
    \" A7 I$ y7 e; `! I; R) Y
  3. -0.752157  6.538620  0
    . J% ]8 \' J6 `/ S; M
  4. -1.322371  7.152853  0
      \/ \1 e( j% h6 s! w
  5. 0.423363  11.054677  0
    1 H0 M+ n# i. t) v* O( e2 E
  6. 0.406704  7.067335  16 `$ R/ ^; {8 k5 J. `, |# p% {
  7. 0.667394  12.741452  0- V- }+ ?3 H; {' p4 @
  8. -2.460150  6.866805  1( S8 k+ g/ c% M1 }
  9. 0.569411  9.548755  0/ j/ w5 ~0 }! F# K6 ^( B/ ~) `
  10. -0.026632  10.427743  0
    ! E3 ]- _$ v: _6 x9 _) R
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt& _) s* x4 N& x% Z( o
  2. import numpy as np
    : r5 V; Y6 U/ x5 N
  3. 9 g; @' f3 o, F; U5 E9 L
  4. """
    , [# i. H: v0 b  q, N3 o
  5. 函数说明:加载数据, f/ I) {+ E1 h\" D0 c
  6. $ D' k3 @' H\" _8 s
  7. Parameters:
    # E- S; i& s2 |0 i. u+ W6 I
  8.     无2 |* r% X( M5 o' V
  9. Returns:( v/ P+ z- W. f0 |3 R3 [
  10.     dataMat - 数据列表
    # D% u2 B+ J! \2 z  g4 N
  11.     labelMat - 标签列表
    ) g; A5 L. h; u* x0 h3 n% d$ i
  12. """- v6 l, \8 Q' i% s# \3 |& i
  13. def loadDataSet():
    4 N4 b, i% |7 N9 l; J
  14.     dataMat = []                                                        #创建数据列表
    4 N2 X  |' H: g4 K\" W& \; x
  15.     labelMat = []                                                        #创建标签列表
    / n# a\" H; W: h
  16.     fr = open('testSet.txt')                                            #打开文件   
    1 N6 E5 H$ }& {8 ~* i2 b& i
  17.     for line in fr.readlines():                                            #逐行读取- q/ J2 j\" g\" B9 _% E9 F/ r
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
      _* p9 K$ H8 i7 D, X/ A+ n
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据4 k; Z$ C* O( ]8 i/ P& p
  20.         labelMat.append(int(lineArr[2]))                                #添加标签  W1 w+ ^+ g! |7 v. [
  21.     fr.close()                                                            #关闭文件* S. B1 g- k1 v3 e
  22.     return dataMat, labelMat                                            #返回
    ( D& p  X6 ~9 k5 A( M

  23. : V8 Q2 g6 E, P8 N\" x; r4 s. `+ m
  24. """$ b/ M6 F8 Q) X1 s5 R! n
  25. 函数说明:绘制数据集5 X: h8 q: f3 }( j7 \( L

  26. 0 j6 m6 W- S) S8 y4 w* r
  27. Parameters:# Y$ ]- a# U6 [; a3 K5 o
  28.     无
    ' h# E! t0 V# e. `
  29. Returns:
    * [6 k: l/ A3 s( N4 a6 j7 \: O9 ^
  30.     无* a( e1 E9 e0 K4 Q; J8 I2 U
  31. """
    / i( E) ~* `& i1 `  W
  32. def plotDataSet():9 Y' _; n1 I, Z6 ?0 Z. r0 a6 D4 @
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集) A\" t) k3 `  M0 l8 |, c
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组7 M' x; j; S; h
  35.     n = np.shape(dataMat)[0]                                            #数据个数
      }/ R  B+ F! K
  36.     xcord1 = []; ycord1 = []                                            #正样本. V& O4 J0 w3 T& ?\" g3 A
  37.     xcord2 = []; ycord2 = []                                            #负样本
    + K0 @/ K/ O- B$ N
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    ! A: w8 X3 F0 K+ H7 G
  39.         if int(labelMat[i]) == 1:
    ( `, a) x: A6 h: v+ w  l
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本6 |\" z- h# Z$ c! b3 `
  41.         else:* n' L0 w, `; t3 ?) A# k! a
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    2 B% \% P: ]0 b' u
  43.     fig = plt.figure()6 B1 `6 W; ^4 c+ j) `/ G% p
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    / S: \6 ^4 H7 a& W' i0 i
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本% }  f4 @0 K, v3 Y
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    \" N; {  }! Q( D, b2 ~\" p/ }
  47.     plt.title('DataSet')                                                #绘制title
    7 w9 ~# ^  O$ u4 d$ \+ g9 l1 s
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label# n+ y1 N5 `$ e- |3 c  {* A1 \
  49.     plt.show()                                                            #显示
    8 G: P# d1 p6 I, k5 p3 a( x
  50. + ~; l# Q2 U7 ]4 ^& w1 e
  51. if __name__ == '__main__':7 Z, r1 m: P# ?. e  `9 G8 V
  52.     plotDataSet()
      f8 @& {: k7 S& c
复制代码
VeryCapture_20231130171817.jpg   ?  I3 o4 i" s2 ?! g2 r) 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/ T4 t3 K8 A% |2 W6 H4 C: Z5 |
  2. 6 }& k\" ^* c0 y! C
  3. """9 M0 J' x) o) b\" ]3 ]
  4. 函数说明:加载数据' j. Q$ R5 d3 n/ [
  5. \" {3 U( ^$ `: P. z) c' |5 ]
  6. Parameters:
    0 L$ K/ G5 r, W( s1 A
  7.     无: |% I6 ^* g& f+ _* z
  8. Returns:\" U5 ?4 M. d# V6 e8 }2 ]4 c
  9.     dataMat - 数据列表  A. d* k; W; }3 Z# {! _
  10.     labelMat - 标签列表  g# E/ e  A4 o( `
  11. """
    9 g% D) \( p; C4 T
  12. def loadDataSet():
    2 i4 `- p+ o, {. i0 K! a
  13.     dataMat = []                                                        #创建数据列表  w, r/ |1 i) m. a3 f3 h% C- m
  14.     labelMat = []                                                        #创建标签列表; H# x* k8 Y1 O# n' Z
  15.     fr = open('testSet.txt')                                            #打开文件   1 ~, |$ N\" k7 H* W
  16.     for line in fr.readlines():                                            #逐行读取' c5 _  Q) h7 v# e# _
  17.         lineArr = line.strip().split()                                    #去回车,放入列表; ^+ O5 ~\" e6 {7 o/ c
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据5 ~: G& f' O\" \) \$ N' c
  19.         labelMat.append(int(lineArr[2]))                                #添加标签: ~% c' `! S6 F3 T: h0 k
  20.     fr.close()                                                            #关闭文件& x* P& v& Y$ `* }
  21.     return dataMat, labelMat                                            #返回
    + A) H- _4 [6 @6 o8 V* o

  22. : t4 D\" w( J+ n; f4 c2 ~  g
  23. """
    1 R) F: R  m' n9 x  j6 I+ O
  24. 函数说明:sigmoid函数, l! \( [4 \+ U( M
  25. ( [  {1 a5 M3 t( |0 ^3 a
  26. Parameters:
    6 `& Z\" a2 e) }+ P
  27.     inX - 数据: G7 n4 p9 ^- C4 I
  28. Returns:
    4 k. c/ o5 t9 O! N
  29.     sigmoid函数5 k5 G3 n( x) q
  30. """
    2 V\" m; {! q\" y2 z+ M2 a& \
  31. def sigmoid(inX):
    4 d6 M  ?. @/ N. v4 B: @
  32.     return 1.0 / (1 + np.exp(-inX))
    3 i& j+ p' X) o$ J6 W0 `

  33. & R6 X1 @' v% ?

  34. - e- H; E/ u, a& O0 b
  35. """; A\" ~5 d% d/ T$ e
  36. 函数说明:梯度上升算法: p- f7 ~9 k4 L. h5 N0 T
  37. 0 F) |2 w1 r% k2 C1 ~& z# j+ o
  38. Parameters:3 W4 [* Z0 J+ {\" m
  39.     dataMatIn - 数据集; ]$ c! C; [' g! s2 M7 a\" ^& a: B
  40.     classLabels - 数据标签
    6 W, v5 N5 h8 B; l
  41. Returns:
    3 H; u. o/ _& ~$ Z- ~& t/ k9 @) G
  42.     weights.getA() - 求得的权重数组(最优参数): ~# |4 j- u3 F: `5 \: H) M
  43. """
    & T7 O\" M; |: J\" l9 I2 N
  44. def gradAscent(dataMatIn, classLabels):
    , I\" p% S' V2 r9 D
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat$ s3 L- `: g: T: P9 x  v& I- d, F
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    - @8 o% |/ a! r: o
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    : ]% {- }! p6 g; x) S! m) k: {
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    + M9 Z/ v  o& I2 w; M
  49.     maxCycles = 500                                                        #最大迭代次数+ s% \( ], |# s; i* `9 T) ?\" O: d
  50.     weights = np.ones((n,1))
    5 P+ ?, u4 X3 |/ a- |, e. ]& y9 x  y7 e; O
  51.     for k in range(maxCycles):
    * {9 i; x. j# A3 G, {. s
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式# b7 n- n7 w2 S\" o7 o4 N
  53.         error = labelMat - h+ K; }7 X  `4 {+ P) x
  54.         weights = weights + alpha * dataMatrix.transpose() * error9 R7 \  P; N# v/ E: P
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    ! X/ k& |# J( _. @3 u1 v

  56. 6 C# |3 U' D6 P, E& ~* e
  57. if __name__ == '__main__':4 `6 R2 m/ _9 H# [8 J; i7 e6 k3 J  C
  58.     dataMat, labelMat = loadDataSet()           $ G( @( M3 }0 [% u( G
  59.     print(gradAscent(dataMat, labelMat))
    , n/ I9 k4 U, {$ o* d2 o& E8 ]
复制代码
运行结果
  1. [[ 4.12414349]/ A\" n\" ~/ V, i+ E% d2 L
  2. [ 0.48007329]' y4 h  u& E\" [/ C: x5 x; u
  3. [-0.6168482 ]]' X0 |& U\" o# |( M2 _& v/ v
复制代码

7 z( Z' v( h( |3 Y2 s" M' h" d( c
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 08:02 , Processed in 0.493079 second(s), 54 queries .

回顶部