QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    4 E$ i6 E; K' v/ P
  2. 函数说明:梯度上升算法测试函数4 `0 b9 q0 q2 ?5 K

  3. % A# |9 M' I2 x  w; q, x$ A
  4. 求函数f(x) = -x^2 + 4x的极大值6 a7 y9 V* ?5 m: U) r! d
  5. $ l  B- F3 T3 I! d& J' X; k
  6. Parameters:  i- O' L9 B( E- ]
  7.     无: _9 p9 z4 b) N& r4 H& I
  8. Returns:6 e1 j\" B  j6 C+ v& M5 l5 M
  9.     无
    ! R$ L1 l: p\" r! z7 m
  10. """4 Q$ P( A4 N/ [3 t( n
  11. def Gradient_Ascent_test():
    ; u  e+ F# A. _* o) W5 T  e
  12.     def f_prime(x_old):                                    #f(x)的导数4 n* A. n, ?# l/ q) I( y/ |
  13.         return -2 * x_old + 47 |$ |% |\" V  p8 _( Z+ h3 w
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    5 f0 ^* @- n1 x6 u7 r: q
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始7 |( m/ `& Z  z# K$ f
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    # a8 N* k; ~$ ?* Q
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    7 [* _4 L, S2 T9 e% M
  18.     while abs(x_new - x_old) > presision:
    : g( q4 ?& F% J3 U& M2 B
  19.         x_old = x_new+ ?! F: Y' O; l3 I5 ^: O3 S
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    / g  S+ R0 V\" x% |% Y: H- k/ h% ^
  21.     print(x_new)                                        #打印最终求解的极值近似值. u\" I+ r# U/ m: B\" H

  22. 3 D2 G% D( v0 U9 n+ z; f5 [
  23. if __name__ == '__main__':
    7 D  S0 v3 a8 O2 b6 r/ V( F  X
  24.     Gradient_Ascent_test()
    6 n- s\" V9 b# x6 x# }6 U
复制代码
运行实例:
  1. 1.999999515279857  _' k, G5 T4 m# p: r
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
    ' ~  d\" i9 i: P, z( T( C( v
  2. -1.395634  4.662541  1
      m. A  w# q8 t
  3. -0.752157  6.538620  0
    8 P% j4 j) E/ D7 k, a! y
  4. -1.322371  7.152853  0
    - k  {5 x  i2 K
  5. 0.423363  11.054677  08 N* v$ u: }\" I1 N; ?9 u2 K
  6. 0.406704  7.067335  1
    3 Q6 E3 V& [* m\" {1 u\" D
  7. 0.667394  12.741452  0* ^3 Q9 b: Z1 d) Q' Y
  8. -2.460150  6.866805  1
    ) i- F: Q: M5 O) ]+ }* _: b8 ~5 U9 L
  9. 0.569411  9.548755  0! ]9 K4 D/ d3 w/ a  Z5 _
  10. -0.026632  10.427743  0
    # N, l' h4 G7 A' p1 |, ?
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt( l4 E1 j3 m# b0 s8 i
  2. import numpy as np+ U5 u1 W. F  B9 k- S' m  X\" c) {

  3. : E, F' P; D- {4 D5 ?. j6 N
  4. """
    ( k- u+ L& |( ~6 ?8 l\" {
  5. 函数说明:加载数据
    2 k1 }: \) ^. C' M0 x# U
  6. ! m; V0 |9 r# o
  7. Parameters:
    9 ^$ H, B/ r: }/ B/ n8 x0 E5 W2 ~
  8.     无; J  Q( \! a  }0 C, a# M
  9. Returns:
    : b6 R9 g5 d' U+ Q2 h1 G. {
  10.     dataMat - 数据列表) u: g6 O# W7 c7 t/ H
  11.     labelMat - 标签列表+ ?4 G, }- J/ O8 p* @
  12. """
    - r/ M- l: Y6 b; |5 \
  13. def loadDataSet():
      w\" m8 A6 t; {9 ]) A( s
  14.     dataMat = []                                                        #创建数据列表
    0 f6 f\" |% D0 i\" ~, `- Q* t
  15.     labelMat = []                                                        #创建标签列表( L0 z5 ?# G  @: B$ `$ `1 W3 u; i
  16.     fr = open('testSet.txt')                                            #打开文件   4 ?; F4 N/ p\" B& z  |+ l
  17.     for line in fr.readlines():                                            #逐行读取9 }$ R+ M' z4 S4 J( g6 A
  18.         lineArr = line.strip().split()                                    #去回车,放入列表+ s  s& b) u. s( a; J4 y7 d2 e& F
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据  c& Y; F2 G2 h# N' w9 V, `
  20.         labelMat.append(int(lineArr[2]))                                #添加标签! K* b. u4 f8 ~3 Z. P6 b
  21.     fr.close()                                                            #关闭文件
    5 f7 ^6 ?7 S# s% L
  22.     return dataMat, labelMat                                            #返回
    6 M; I2 ]& `3 v
  23. 3 Z$ \0 U; N7 J\" b$ s
  24. """
    ( |: m9 V/ L7 l4 |
  25. 函数说明:绘制数据集
    ( L1 @7 _9 \; e6 u* i

  26. - t  Z0 Y+ U! N/ D  e, C/ w
  27. Parameters:* G, N! v6 o/ d( J
  28.     无
    8 d* D; n( c8 O/ J7 N
  29. Returns:5 G$ m% g+ r1 f) _; a
  30.     无
    * h% h# o( y0 r6 [
  31. """
    : ^7 g! H8 m7 X2 X2 `' j; |
  32. def plotDataSet():) C. m( S- P, l; }; m+ o
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集8 O$ C  I, l& f' K. \
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    & U! M: a) H) n% A) |/ C
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    3 U* |/ Z. Y7 S; Y
  36.     xcord1 = []; ycord1 = []                                            #正样本2 c# H/ g: ~; E% D
  37.     xcord2 = []; ycord2 = []                                            #负样本
    \" a% Y/ o, }6 o& X' i
  38.     for i in range(n):                                                    #根据数据集标签进行分类/ K0 E\" a9 x- ^4 U
  39.         if int(labelMat[i]) == 1:: U( e$ F# ]# E
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    5 V$ ?# p* H3 z3 T
  41.         else:
    8 \' O- R; }\" o& p) w& U
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本& w* {* E; E/ h( ]+ h( z7 c  {& u
  43.     fig = plt.figure()\" y  O0 X1 ]9 A7 O0 A  r; ~
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    7 H  Z) L4 [, V. j' c4 c+ ^6 i
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    ) |3 F! B4 O9 s\" z, u
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    ! V8 p. k2 t$ t3 x5 B9 E+ k' l* A2 c
  47.     plt.title('DataSet')                                                #绘制title
    \" {; ?9 \- q( E: E' g
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label: ]! g4 Q\" F/ l6 @  c# t3 k4 s4 ?3 H
  49.     plt.show()                                                            #显示
    ; V! m. U$ K! q: h

  50. 2 i( _% {1 z9 c9 S# U
  51. if __name__ == '__main__':
    5 @5 o. ]( u1 q: l
  52.     plotDataSet()# P5 I) Y. h# b/ Z\" n, k
复制代码
VeryCapture_20231130171817.jpg
  u  q2 T' V; J9 ]" b从上图可以看出数据的分布情况。假设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/ t2 m3 x( i4 J9 m1 A

  2. + E! h; R4 `3 w, l. _$ U
  3. """% \+ ], [, ?4 i# H
  4. 函数说明:加载数据7 \  l3 I5 ?2 h: f- n
  5. ' L8 b9 u2 ~' v  }1 D8 Q5 z
  6. Parameters:
    6 W- Y: V6 d7 ?7 e3 P  k& ~. z! S
  7.     无
    - u/ P3 C, R! F9 }- r3 T
  8. Returns:3 ]% Q+ H0 F/ M# q0 Q0 T) C/ @6 m
  9.     dataMat - 数据列表
    3 _( H\" x9 G2 d' l
  10.     labelMat - 标签列表& V0 U/ o3 Q8 J- \- r/ F
  11. """6 ]2 ?8 q8 P  N$ n- n, R4 C# x
  12. def loadDataSet():
    ' l  L- }+ K, _  Z; l
  13.     dataMat = []                                                        #创建数据列表
    4 Q, A\" b) Y& Q+ a3 g8 Y6 b6 r
  14.     labelMat = []                                                        #创建标签列表
    7 p  [! {- ?& q
  15.     fr = open('testSet.txt')                                            #打开文件   5 ?' V6 E  g; f: y' N
  16.     for line in fr.readlines():                                            #逐行读取
    ( \+ [! x6 C' [1 r\" K: R- x5 q$ `
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    & f; J* I  c! t1 o( u- n3 l8 Z
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据' x4 H. V/ \+ O
  19.         labelMat.append(int(lineArr[2]))                                #添加标签% l* F* R! ]1 \* I. U9 Z$ [
  20.     fr.close()                                                            #关闭文件
    # |! w( v* z7 {
  21.     return dataMat, labelMat                                            #返回! \, F5 @- s: H; u' \; F
  22. 1 K6 b) _8 ?. B! Z& y6 l# ?  g6 l3 I* l
  23. """
    8 B8 F7 x: c* D# F% X4 u
  24. 函数说明:sigmoid函数
    7 w1 K; y4 D: [4 D+ P4 A' Q/ r
  25. ! e6 F% w' F% d% w
  26. Parameters:) \7 {: p0 g0 e$ y3 `
  27.     inX - 数据
    , J, N4 g! [0 s; x0 U  N3 l
  28. Returns:
      S/ z! Q\" B8 {0 h# H& p7 h6 L  Q
  29.     sigmoid函数5 e% q  m- u$ _8 M) K\" z
  30. """
    \" \8 x& P1 m$ K, q4 M) K
  31. def sigmoid(inX):, E- G# b  [1 D: t  k3 T, |8 p
  32.     return 1.0 / (1 + np.exp(-inX))
    - {# U1 B! P! S! o/ G# _  V
  33. * j' x, |3 T( j2 S3 v
  34. 6 I9 e& Y$ c. b# {+ @% g
  35. """2 ]+ Y3 W8 o3 L
  36. 函数说明:梯度上升算法
    + K3 z9 k) n; f! ]

  37. ' O/ I6 s( b\" U+ q6 I8 k
  38. Parameters:
    1 K/ k# E2 X\" [8 m
  39.     dataMatIn - 数据集
    0 C# R0 r1 i9 p1 g  U% _6 J& A9 O7 F
  40.     classLabels - 数据标签
    : R( t: _: |; r
  41. Returns:9 _) o\" q. P0 Q% v  @, K, S5 C
  42.     weights.getA() - 求得的权重数组(最优参数)
    . {4 O\" n: L. A: Z& F( H; V
  43. """
    ; L2 D- G& l5 T. @2 C  z$ i* }6 i
  44. def gradAscent(dataMatIn, classLabels):
    # G- x\" l, }3 _\" G8 L% U* E: f
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat+ x; c3 w4 A: P  \8 |) E+ ~4 }
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置5 Q$ p) ?8 R5 I
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。2 `8 \5 {1 _! Q  W
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    % E6 u, O& d! G
  49.     maxCycles = 500                                                        #最大迭代次数
    ) ?/ \, D; S! q8 P/ A- k
  50.     weights = np.ones((n,1))
    \" {0 Y\" [+ F7 e+ K
  51.     for k in range(maxCycles):! C) Z; \) |0 ^0 o
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    ( _) e4 Q$ v- n- ?- L: r
  53.         error = labelMat - h4 d( v* U9 d$ U/ Y$ t5 T\" g: E
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    7 k2 S8 `5 N3 f+ ?1 ?0 k  F
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组9 E8 L; k- q/ v$ _* R* H

  56. 7 x$ x2 c% x  G
  57. if __name__ == '__main__':
    - t1 ?* Z% B, c& h
  58.     dataMat, labelMat = loadDataSet()           * Z2 y, D4 Z8 q
  59.     print(gradAscent(dataMat, labelMat))! C7 R; n7 U+ h* f\" }
复制代码
运行结果
  1. [[ 4.12414349]
    5 \+ x$ J! ^9 o- j- W
  2. [ 0.48007329]
    ! B. }  b# E4 R  _7 D' D* V; I
  3. [-0.6168482 ]]
    $ q: Z2 f; h9 {3 \
复制代码
/ t( W, N, n/ L; ~; Q. f
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-26 07:31 , Processed in 0.358740 second(s), 53 queries .

回顶部