QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """, u1 h( f+ P9 W/ |- Y: k
  2. 函数说明:梯度上升算法测试函数( G  `  e, ?$ |! |; B. L6 h# [
  3. 2 O( t! y) Z' }# S8 {; B9 R5 |9 ]1 ]. L
  4. 求函数f(x) = -x^2 + 4x的极大值
    $ A& u9 X% R0 X0 F\" s7 [
  5. ) z! Z: `. [+ Y; d4 }2 u- v
  6. Parameters:6 C, t- Z; r7 v
  7.     无
    4 ?$ F8 t- K) d7 M4 x0 W
  8. Returns:3 p6 j. F5 V6 I2 J  c9 K9 B; [- }; Y6 K
  9.     无$ F+ h: V9 \\" f
  10. """
    ' v' j) S\" z) {& `. ~* [; S* Q7 b
  11. def Gradient_Ascent_test():5 @2 v( M% g. H2 a9 i& P
  12.     def f_prime(x_old):                                    #f(x)的导数$ _, \( [+ {  I( _
  13.         return -2 * x_old + 4
    & K9 o& J  Y4 }- l9 |5 q) a# x) m
  14.     x_old = -1                                            #初始值,给一个小于x_new的值, G3 g8 S# Q3 v4 [' z' @
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始8 Y+ P; w' ]0 G1 c
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度7 ~/ b\" b! w2 ]! o1 H
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    - s  |* [( ?0 b( u
  18.     while abs(x_new - x_old) > presision:; {1 I  f- T9 H) g7 r
  19.         x_old = x_new- j2 B) G& q7 g
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    , i5 i; ]\" V& S/ W4 u/ R
  21.     print(x_new)                                        #打印最终求解的极值近似值
    + o4 H% Y, G( U2 d5 x( _, |. Z

  22.   n# v5 F9 {. h' {9 e. ]
  23. if __name__ == '__main__':
    7 L# [* n/ q) c3 W) y
  24.     Gradient_Ascent_test(); T1 {% m\" X$ _8 ^1 I! n8 c/ B$ Q. l
复制代码
运行实例:
  1. 1.999999515279857
    2 F8 G: _: x; [\" z
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0\" \3 w, J! B' K* ?7 ~3 ]3 n3 J
  2. -1.395634  4.662541  1
      e! g) Z# f0 U) N. f7 \& O' H
  3. -0.752157  6.538620  0
    0 w0 Y# Y\" [8 k$ g9 t
  4. -1.322371  7.152853  0
    \" p! C& C2 _) i
  5. 0.423363  11.054677  0, t: f0 C  g5 O8 p- h! K/ @
  6. 0.406704  7.067335  16 _7 p7 u- r( O
  7. 0.667394  12.741452  06 H\" ]  p$ S5 u1 i5 s
  8. -2.460150  6.866805  17 N  W) Z* B+ {/ {: G' o
  9. 0.569411  9.548755  0
    % i4 V  X9 c- I& @6 q
  10. -0.026632  10.427743  04 D, x+ Y5 d0 J
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt6 U% b2 Q* `3 o7 S# S0 A
  2. import numpy as np- O5 ]( D- _9 q! I- g

  3. ! ~3 d\" t# W8 J6 e
  4. """
    : e- w/ v2 r\" E7 R
  5. 函数说明:加载数据
    1 V! @+ p\" T( ^4 a) P. z

  6. 4 y  q( p* ^! c: W5 F3 z
  7. Parameters:
    6 s  f+ W7 e\" P7 Q
  8.     无
    0 Q  J6 ?+ X. h+ s/ \\" Z
  9. Returns:
    2 J, |2 l8 a6 ^& |
  10.     dataMat - 数据列表) ]  ~$ @; o4 \. b* P- S/ l/ N' \& v
  11.     labelMat - 标签列表
    0 q. k2 q6 h/ j+ v& n+ W7 s/ {
  12. """9 B  t, |% U* e
  13. def loadDataSet():
      O) N+ A- j0 {0 X: q) u
  14.     dataMat = []                                                        #创建数据列表! w9 d3 h- ?  n$ B, l+ w
  15.     labelMat = []                                                        #创建标签列表8 \4 e! r  f* B& E5 F
  16.     fr = open('testSet.txt')                                            #打开文件   \" M\" z- u: `5 S\" \4 O! n6 B( U
  17.     for line in fr.readlines():                                            #逐行读取
    5 h; B6 @1 a/ g8 X8 V
  18.         lineArr = line.strip().split()                                    #去回车,放入列表; i, ]0 i. x& G
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    ( a1 z7 r3 j  d4 c; V( H0 _; n
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    + ~( O) f  T; g! }! s8 }. P9 ]
  21.     fr.close()                                                            #关闭文件
    8 Q4 Z; @, k1 D: k\" V* x: O0 U
  22.     return dataMat, labelMat                                            #返回
    \" S: ?  d) {\" S7 q' i/ R) Q
  23. ' j& |1 T, k: t9 R' H
  24. """
    3 n& i  j) J: |\" C; Q
  25. 函数说明:绘制数据集
    ; ~7 P0 }- y$ K, h
  26. 1 ~4 ^4 f% i; F9 v+ q
  27. Parameters:
    - B% Y4 ?% b. w  p6 ^* o
  28.     无
    ) b' A/ V. D: X4 ^, _7 E  ~, }
  29. Returns:
    6 P+ v* y$ R' J4 G, D
  30.     无
    ! A  \1 b& B- T) z3 K7 d
  31. """) H1 s) \! x- d: Q- h+ ^# m
  32. def plotDataSet():3 g5 {$ G0 S8 h: \
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集# ~\" w+ S* k/ V# h
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    $ V, [; W& O( d' G
  35.     n = np.shape(dataMat)[0]                                            #数据个数: v# w( v. i1 h- r2 B$ W
  36.     xcord1 = []; ycord1 = []                                            #正样本
    - i* S/ M; W: Q% `! p* i4 J% S
  37.     xcord2 = []; ycord2 = []                                            #负样本1 L, H) f2 I4 ^* \/ Q* ^
  38.     for i in range(n):                                                    #根据数据集标签进行分类1 e% c! f9 r) R
  39.         if int(labelMat[i]) == 1:
    ( g4 N9 n* c7 j6 G$ q
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    0 k' f+ G- F4 Q
  41.         else:+ S6 l5 G  v5 U, _  q\" E$ x* t
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    # e( i( p) u% b. G4 o6 k
  43.     fig = plt.figure()+ x! N0 H2 {7 C2 m- U
  44.     ax = fig.add_subplot(111)                                            #添加subplot2 c5 C6 ]. M0 B' }6 g1 h) y
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
      ~6 m  t8 h; b. |5 I( w
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    - M$ w6 `\" `, k2 u: g$ o  D3 N
  47.     plt.title('DataSet')                                                #绘制title' ]  g% W% |; E5 b1 f3 ^- g
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label% Z\" ?0 C; G7 N\" _( A' J5 i
  49.     plt.show()                                                            #显示/ b# j* N' `( z: l1 H4 P( V/ P

  50. 2 D( T0 c+ V  ~- n( N% L
  51. if __name__ == '__main__':
    6 N3 x: q' M& F* v0 u5 u+ V
  52.     plotDataSet()4 y. L# h; I! M9 U% {8 D
复制代码
VeryCapture_20231130171817.jpg
. y& x! H9 {2 P7 E从上图可以看出数据的分布情况。假设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
    ( r. Z4 ]  ~% q3 w/ N) F

  2. 1 i2 P+ c* ]% F) W; S! M
  3. """+ b$ w/ B( Z: N) e- E: Z
  4. 函数说明:加载数据& {* V- o. t1 o( c

  5. 6 g: d/ e  i/ W( c0 W0 n
  6. Parameters:) L# M8 _5 H3 h5 n4 e) E/ J
  7.     无, g' W% D% x. F$ ]! f
  8. Returns:\" T) e9 u3 X5 u( W) q7 Y1 S
  9.     dataMat - 数据列表$ A, `! ]6 J- P+ N- y  c6 c\" E
  10.     labelMat - 标签列表
    / [9 S# p, P' B5 Q4 m) m
  11. """
    * e' L( w2 i# Q* U
  12. def loadDataSet():. K) _, r4 N7 ?! R5 A! l; a# h
  13.     dataMat = []                                                        #创建数据列表% r, t; \7 `\" ]4 ], ^5 r6 H
  14.     labelMat = []                                                        #创建标签列表5 ^- K\" c3 w+ |
  15.     fr = open('testSet.txt')                                            #打开文件   
    0 L9 L- b: n& a! S. ]% k! }
  16.     for line in fr.readlines():                                            #逐行读取/ v2 c  b% r. j
  17.         lineArr = line.strip().split()                                    #去回车,放入列表1 d9 {6 ~( l4 t, d) t
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    . y4 o0 b, F* J1 C  f# j0 K
  19.         labelMat.append(int(lineArr[2]))                                #添加标签' J: J; Q9 p2 }- Z+ j
  20.     fr.close()                                                            #关闭文件% ~; U8 O: T. N
  21.     return dataMat, labelMat                                            #返回
    \" y  y9 J1 V# o( q

  22. % o) p- P2 U. T8 C; V& X
  23. """
    + u4 ^/ |: w. U6 _8 l
  24. 函数说明:sigmoid函数
    , }& k! j8 p* b& H/ P
  25. 0 g/ f$ d! D0 D: h( ~7 y/ e& v
  26. Parameters:
    7 a, E' e( L. v( e: z5 W* v
  27.     inX - 数据7 H* p: ^\" u. p) K4 T% L/ l
  28. Returns:
    # z( {: ^. Z7 p( K
  29.     sigmoid函数# p4 q5 c9 z' N6 X, W* Z1 e
  30. """
    / S9 V* d\" Z8 ?; a7 v0 n6 x
  31. def sigmoid(inX):
    2 J0 b. g% ?# N. r) g# x
  32.     return 1.0 / (1 + np.exp(-inX))
    ; C1 h# x\" ]- h* Q  e9 p# e5 {+ O

  33. 8 O) Z# N) J5 P
  34. 7 _& j\" N' |! }+ y* M9 L6 t
  35. """
    ) K7 t7 K; p* z
  36. 函数说明:梯度上升算法
    . |8 `% l& f& M$ K5 k  _8 }

  37. 2 F! J/ t\" \! V/ A- V4 [4 H
  38. Parameters:' ]; L6 E\" {% o9 \
  39.     dataMatIn - 数据集4 u, W) X8 t3 M' {
  40.     classLabels - 数据标签7 ^' I# ~6 P- @& u! ~+ ~
  41. Returns:
    + Z0 `% R( f* W* Y2 x( K1 A
  42.     weights.getA() - 求得的权重数组(最优参数); I- P1 ?4 |9 P! I/ z9 ~: Q/ l
  43. """
    ( D6 D+ p! Q' e/ m$ u( v6 d; T, L
  44. def gradAscent(dataMatIn, classLabels):% m( y: j9 P; }! k' ^9 o8 V- w4 P7 A
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat8 S) R$ h$ Z# Y  n) v
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    9 i2 L% t% e/ y8 c
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    2 E: e2 M9 a4 o\" Z
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    . G& O$ {0 K: r5 {& q% `6 H
  49.     maxCycles = 500                                                        #最大迭代次数* b0 I' k- h; T\" K4 ?' j* b
  50.     weights = np.ones((n,1))
    5 |  [! j, u- z$ e
  51.     for k in range(maxCycles):1 ~6 |\" D( c) N! D
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式3 F% S6 |. [, n& ^. x
  53.         error = labelMat - h
    # U4 G\" C- S2 o- ?
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    5 |, h# k8 u8 ]
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组3 v2 }$ M+ R+ j; K$ n

  56. - }4 q& ]7 U- M! \7 s3 A
  57. if __name__ == '__main__':
    $ a: k- }$ u# }6 V2 I1 n( G
  58.     dataMat, labelMat = loadDataSet()           
    3 U# t; h# u8 \& D6 C
  59.     print(gradAscent(dataMat, labelMat))
    . h( @) o. ^6 L$ e; f% w( u
复制代码
运行结果
  1. [[ 4.12414349]
    : c\" B4 d  t- g+ I3 r# C5 |
  2. [ 0.48007329]
    & C: V$ W. R8 I% v) C
  3. [-0.6168482 ]]
    ( t3 v8 V( a. g
复制代码
: `' ^( D$ g; R0 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-10-15 05:55 , Processed in 1.401527 second(s), 54 queries .

回顶部