QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |正序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """) @8 b0 j: b. }0 H& |
  2. 函数说明:梯度上升算法测试函数8 Q. C- Y  f- X4 f4 d\" K5 t

  3. % K1 i! c. C0 t1 _
  4. 求函数f(x) = -x^2 + 4x的极大值
    * v) X5 z$ J0 e. C

  5. & i  `3 G0 W  P! Z% q
  6. Parameters:( {% |3 b/ o. N9 i& g
  7.     无
    , p. c( e3 e4 I' B# M\" F
  8. Returns:- T/ W0 b, ]. x$ v
  9.     无8 Z& u+ y) o. e1 _* a3 `
  10. """
    - c8 A4 X8 }, X8 `* X
  11. def Gradient_Ascent_test():
    ( c/ X$ y: p) e! {
  12.     def f_prime(x_old):                                    #f(x)的导数8 ^' ~. s4 s- W0 d7 H3 P% E! Q
  13.         return -2 * x_old + 4
    * Z\" R9 H* R6 J/ I% Y( [+ u
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    6 E. J\" o: U5 N4 e& l* c
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    * b6 k5 _1 K* d7 ~2 z
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    9 @, S$ N( d' e7 p$ V% C* ?3 Q
  17.     presision = 0.00000001                                #精度,也就是更新阈值  c4 p1 R3 n3 n
  18.     while abs(x_new - x_old) > presision:
    4 M2 Q\" k; q\" b. g0 P
  19.         x_old = x_new
    7 I0 Y5 j1 j) b5 p' W
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    ! e* d. ~: \; g$ ^8 `/ U/ I
  21.     print(x_new)                                        #打印最终求解的极值近似值
    : R5 j/ Y( _8 K$ x- z

  22. - ~5 [7 _8 S: F7 `: I3 [1 S+ i+ S' Z7 ~
  23. if __name__ == '__main__':' ~0 @% B9 a( F, z/ j: t
  24.     Gradient_Ascent_test()
    9 z) J: ?5 {* ]% }' t
复制代码
运行实例:
  1. 1.999999515279857& q9 B* p8 n. {5 b- j8 |5 @
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0. j, H( Y2 s/ B
  2. -1.395634  4.662541  1
      ^9 Y7 X; i. M7 B) _
  3. -0.752157  6.538620  0
    - Q- k* e& l! Y) n
  4. -1.322371  7.152853  0\" g+ a9 u( g! _- o3 u6 l
  5. 0.423363  11.054677  0
    + \2 g1 q+ I$ Q+ ^5 m$ z4 F
  6. 0.406704  7.067335  1; v8 l1 e\" V( `; T. [
  7. 0.667394  12.741452  0
    - x7 w; j! c, p1 c  _: f; ^0 w0 _
  8. -2.460150  6.866805  1
    ' z8 c5 U! s9 U. W! e
  9. 0.569411  9.548755  0
    , w8 k\" i; |) @; p/ t5 W& ~' y( s
  10. -0.026632  10.427743  0
      e- n9 D0 V0 j. z8 `6 E5 Q
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt0 V: Q9 s2 K; i$ X
  2. import numpy as np
    , O3 K+ X$ A5 T) R
  3. $ ~3 }% ?9 M4 }& ?. z
  4. """
    & T! x  e( T1 ?9 N) n/ @* u) k4 E
  5. 函数说明:加载数据
    . C$ e+ o- B4 Q6 m2 D
  6. ! E3 ~; Q9 Q. n7 i# F1 j
  7. Parameters:9 b; X+ K# \\" a9 B( y. n& H\" Y9 n
  8.     无
    ' b4 t\" o* s9 l! M* V- s! N
  9. Returns:
    2 W0 ?5 `# ]* G4 D
  10.     dataMat - 数据列表* W5 c3 b, W5 G; }7 W7 t
  11.     labelMat - 标签列表, I- F6 i8 ?' F' m' K+ a1 Q8 I
  12. """% h# O1 B: ]! m: g
  13. def loadDataSet():+ {$ D9 A& b, I- \( C0 i/ O
  14.     dataMat = []                                                        #创建数据列表% e% J( {9 c4 E; ^6 ?8 X
  15.     labelMat = []                                                        #创建标签列表2 L4 Q8 J. o, C$ T6 D6 I' I\" r
  16.     fr = open('testSet.txt')                                            #打开文件   9 Y) H' G% y& ]6 \\" K\" S, j  s
  17.     for line in fr.readlines():                                            #逐行读取7 A: O6 R! n* b9 F5 B* G\" d# R
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
    * Q5 i4 V7 z+ b* V4 c
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    6 Z6 u/ P8 m( v  i/ a$ O+ h3 v
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    . f# m8 T/ S: {/ [: C, P) K3 B  R
  21.     fr.close()                                                            #关闭文件) E% U1 C/ h1 T, L. v4 C* s1 q8 e
  22.     return dataMat, labelMat                                            #返回
    7 _+ \8 E( W; ~; j1 J\" v  L9 `5 s$ i
  23. , Y, f  f; c4 l1 p
  24. """
    , U- z\" O8 n- M
  25. 函数说明:绘制数据集0 k7 S. t3 e, e- B# V$ B2 V/ N& \' g

  26. # R( H* [8 \+ Q% p# ]; ~9 @  h8 ^
  27. Parameters:
    \" ?6 M8 G$ u- E
  28.     无
    8 L; D* F8 L\" E4 a0 v' y
  29. Returns:
    1 B6 Y; r' g( u; z+ |7 I
  30.     无
    . u3 R6 M2 M. }* Z; U
  31. """
    7 p7 A8 X) {+ @& ]
  32. def plotDataSet():5 [2 R5 |/ b( ~% U- N: L
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    : J; s; m4 N1 r
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组' K2 S/ u. H1 \$ A* D
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    9 E% ]4 H% [\" G
  36.     xcord1 = []; ycord1 = []                                            #正样本% }  u! U  e\" `! l
  37.     xcord2 = []; ycord2 = []                                            #负样本
    ! `- S) v1 X7 X
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    ! e- N9 Z: |$ N\" y9 f6 J- p
  39.         if int(labelMat[i]) == 1:4 r9 J, d0 ^7 P
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    0 X7 N) k0 N1 C
  41.         else:2 z& W2 H% i5 b: k. E
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本0 g' D. E7 H$ q2 e9 w! R
  43.     fig = plt.figure()
    * X8 e& y; M  ~3 [
  44.     ax = fig.add_subplot(111)                                            #添加subplot& P: I, [- e0 ~7 P( t: f
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本+ j; u: ?* H# S
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本) n+ ?, Y\" _7 t9 T+ {
  47.     plt.title('DataSet')                                                #绘制title
    & k8 c: o( W+ v# S2 m& J
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label1 U* i6 C# F0 M: ~9 |7 o* I
  49.     plt.show()                                                            #显示
    ( Y4 V\" F* x5 q4 _( X/ Y
  50. 6 @4 W; h7 j9 _8 b' w8 v: K4 ~
  51. if __name__ == '__main__':
    : R* ~8 k5 A9 n3 c: ~. w+ j0 _' f
  52.     plotDataSet()
    \" N, z8 ^5 h9 X% ~# ]
复制代码
VeryCapture_20231130171817.jpg
7 `9 t6 ?' n/ |* ?从上图可以看出数据的分布情况。假设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
    ) c0 N0 i9 u# }, e# h
  2. 4 h3 p0 ]' r3 N( U
  3. """
    ; U6 o: G2 V4 \/ z1 G) L
  4. 函数说明:加载数据
    8 b8 e- f) B\" j2 b8 ?  F
  5. 2 |) }+ M' F' U1 y# U
  6. Parameters:) H4 D& x  ^3 p* p9 G7 l8 |
  7.     无0 U  N' y) G, \% \0 q+ T
  8. Returns:; y, ^% l. E8 r! H2 p) Y5 @
  9.     dataMat - 数据列表
    5 w- ]3 u\" Q. W/ `
  10.     labelMat - 标签列表
    \" e$ Z( F/ f' L( {2 N
  11. """$ @3 x0 h4 E( a+ q
  12. def loadDataSet():0 X3 `# ]\" ^+ v8 Y
  13.     dataMat = []                                                        #创建数据列表
    * g- Z1 P( v+ q9 |5 ?; g0 `8 }: T; i
  14.     labelMat = []                                                        #创建标签列表% _3 {! s. y- E; J\" N
  15.     fr = open('testSet.txt')                                            #打开文件   
    $ n# Y/ H2 d( [3 N, L: c
  16.     for line in fr.readlines():                                            #逐行读取
    5 K/ F& F7 ~; ~$ p7 g
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    0 P$ L5 p# [/ i% N
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据9 {5 j8 ]* Z5 M: d1 a
  19.         labelMat.append(int(lineArr[2]))                                #添加标签* j  x/ P* ?/ B: ^; Q
  20.     fr.close()                                                            #关闭文件\" G  B0 a8 u1 _) t6 ~* Z$ f\" I
  21.     return dataMat, labelMat                                            #返回* ^' G\" k: P/ ~6 [, f; X

  22. ; I/ ]2 T% w: p
  23. """8 ~* z( A6 |8 A# k- Z
  24. 函数说明:sigmoid函数6 ?( X5 E9 g$ W

  25. 0 `  [; _) v: {  e: s( V  i
  26. Parameters:
    * G! j: z: w3 @0 |3 m' g: R( w- L
  27.     inX - 数据6 L4 d2 F/ w8 ~4 T( z\" F# E) U$ x6 i
  28. Returns:
    9 N0 A% z/ A6 z. ~: Z4 c/ V* c3 x
  29.     sigmoid函数
    - }- i) j& t4 s0 _7 b* D' A
  30. """
    0 c* v8 c3 [; D/ R! A4 U% e
  31. def sigmoid(inX):
    : r\" m6 m( d6 l
  32.     return 1.0 / (1 + np.exp(-inX))
    ; w, ?0 k+ n# x6 R, F

  33. ; H( F& \, X7 ^, h1 f
  34. 0 ?: R' q7 J8 Q0 O+ I
  35. """, Q& J. N9 P0 ]3 v; l; Q% o4 w
  36. 函数说明:梯度上升算法
    ; A6 b0 g) W; C# f6 u5 S5 Q
  37. - L: H0 U' R% f
  38. Parameters:
    : h0 v' ^: i0 ^$ V
  39.     dataMatIn - 数据集+ @7 B! f3 M# \: s7 I5 X
  40.     classLabels - 数据标签
    ; ]; T& |! U# M1 y9 G  }& f' l
  41. Returns:; h$ n# ^/ O/ w+ i3 k3 c8 ]
  42.     weights.getA() - 求得的权重数组(最优参数)& [) \1 w6 h1 M8 Q) j5 z  D
  43. """
    2 C3 e+ Q) d. A# K
  44. def gradAscent(dataMatIn, classLabels):
    3 Q1 n2 S- C) a9 [5 l; p
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat1 C% d. q3 i  @$ _. ?; M
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置\" R# I/ C\" ~5 A/ o/ R
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    ; [% ?! _4 F; Z+ Y9 Y  ]& \6 j4 j0 o
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    ! @& T- B$ [6 ~+ \, c; b3 C; e
  49.     maxCycles = 500                                                        #最大迭代次数
    0 N0 J* Q! Y% D6 K1 X
  50.     weights = np.ones((n,1))4 Z% E) I! t& x2 F; `0 C
  51.     for k in range(maxCycles):
    8 P6 S5 U+ y: \: d% P' M8 Z+ Q
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式  T% i3 T\" U5 A$ y
  53.         error = labelMat - h) _- i% v8 M% y, X
  54.         weights = weights + alpha * dataMatrix.transpose() * error# [- @+ K: d9 V2 B$ c, S% F
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    # U8 Z5 U# m  ~/ {- k8 [& H, H4 y
  56. ) Z3 }: Z, o) w
  57. if __name__ == '__main__':
    2 o. ~\" c% j& _
  58.     dataMat, labelMat = loadDataSet()           & J* A0 _; L$ h8 q2 R( h
  59.     print(gradAscent(dataMat, labelMat))6 H4 C, P9 d+ x1 y! a0 T3 R
复制代码
运行结果
  1. [[ 4.12414349]# B- G8 `  z, t* f* |- I; Z6 |1 X+ B
  2. [ 0.48007329]
    ( r- p% U/ ?' H1 N% o$ l, g
  3. [-0.6168482 ]]7 o. c5 W4 k4 R+ ]$ M9 w
复制代码
( l9 U, c& }* E; G0 J$ P& p5 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-4-12 06:45 , Processed in 0.373603 second(s), 54 queries .

回顶部