QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    $ D* a# h; ]* }- T* C7 G+ O: h6 `% r
  2. 函数说明:梯度上升算法测试函数
    ( N8 x: q; \5 ]+ x9 O% Y

  3. : L2 t( \: \5 D+ l' J# O
  4. 求函数f(x) = -x^2 + 4x的极大值
    9 I! B6 v( t& J\" C; m6 D

  5. + T, F; ~- o1 h  Y. g0 m# l. o
  6. Parameters:3 P' D$ ^- Q) ~& P9 c1 K
  7.     无' j8 q7 ^8 H- j/ I9 i
  8. Returns:
    & R& T\" q, E: N. h; B
  9.     无
    % B! C, M# z# b, I2 T' s
  10. """
    # E  j+ E7 D: V2 k4 |6 m1 o. d9 d, a
  11. def Gradient_Ascent_test():
    + s4 G; @! x# U4 k3 n% o2 z
  12.     def f_prime(x_old):                                    #f(x)的导数
    4 a- e6 n! i* B# C4 A( ~( p
  13.         return -2 * x_old + 4* a+ _0 T3 Q& h9 V, j\" o& z
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    ( X; y* k6 `8 u/ t! g% n$ N
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    + T5 k: W$ t; Q+ Y/ I6 _
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    ) o, ~+ O' m5 I; {7 L7 @* n3 m
  17.     presision = 0.00000001                                #精度,也就是更新阈值+ f- Y  y; I& J$ T' c
  18.     while abs(x_new - x_old) > presision:* ?  X$ }) @; N. M- e6 @2 Q
  19.         x_old = x_new
    1 y7 ^& v+ @: P, s9 X5 X# o
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    7 z! V9 T( f0 G- s1 c, E! w
  21.     print(x_new)                                        #打印最终求解的极值近似值( w& P2 D& B/ s) V. w\" o
  22. 9 B9 h' T3 E8 @
  23. if __name__ == '__main__':* _+ {9 O4 H\" l- D4 b# }. X, p
  24.     Gradient_Ascent_test()4 e# l4 A9 W1 Z; B% k/ {1 n
复制代码
运行实例:
  1. 1.999999515279857\" ^4 u9 @& O) }' E
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
    5 {+ ^4 n. R& t- s
  2. -1.395634  4.662541  1# }0 M1 _  A3 B. c8 P9 X
  3. -0.752157  6.538620  0# w$ J# L# t\" j6 w- O1 z* w( a; e
  4. -1.322371  7.152853  0# K/ R& Y6 M: q, G\" ~3 n
  5. 0.423363  11.054677  01 C0 i7 J6 L# G! H; q& S8 D
  6. 0.406704  7.067335  1
      Z# [5 G! ^7 m+ k
  7. 0.667394  12.741452  0
    1 o1 B4 p0 O3 E5 `2 B\" Q5 @) i
  8. -2.460150  6.866805  1
    1 o. o  [2 G$ y2 K2 t7 J) X
  9. 0.569411  9.548755  0
    4 M) f' s4 ~+ \1 R, E4 N\" K
  10. -0.026632  10.427743  0
    7 Y1 T4 m\" j; l
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    ! t& G$ _' X$ p$ y
  2. import numpy as np6 d- G$ ^, D% z( Z\" n6 a' V\" \7 E
  3. ) I$ [& d7 ~  Z& x
  4. """# y\" _' Z3 u. t; `1 l
  5. 函数说明:加载数据5 j- m6 c+ c# S$ E
  6. 8 _: D6 J; L8 q& ?3 x. S
  7. Parameters:
    $ J8 [! G7 T8 u' \8 ?% \+ i
  8.     无* v3 [: a7 S& L# ]
  9. Returns:) i% G. C8 S! y, u3 V
  10.     dataMat - 数据列表8 `5 J2 r9 S4 r9 P& e
  11.     labelMat - 标签列表' u. G) m9 S# s+ g8 h$ E
  12. """1 c! q+ [* P  n
  13. def loadDataSet():) `1 s$ b$ ~6 H- O
  14.     dataMat = []                                                        #创建数据列表1 M\" B; C5 g' `3 N
  15.     labelMat = []                                                        #创建标签列表
    ' h! h2 E7 q& z* [- F
  16.     fr = open('testSet.txt')                                            #打开文件   / h  Q# ^\" k8 |8 d  @) x
  17.     for line in fr.readlines():                                            #逐行读取5 l6 {4 b0 m, `) Z
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
      {2 P9 p! ~; E9 D! U! N; A7 g6 S, T
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    ( Y7 F0 g3 n% @0 f9 q
  20.         labelMat.append(int(lineArr[2]))                                #添加标签5 V+ K+ j/ f  F
  21.     fr.close()                                                            #关闭文件
    & S& {4 }5 ], y# i3 {6 c
  22.     return dataMat, labelMat                                            #返回
    . y$ I3 a+ S( s' {: I

  23. 3 n5 Y& A4 H\" ~1 H& L3 m% W
  24. """
    5 D1 ~) H1 q* k* u
  25. 函数说明:绘制数据集
    9 {) f. d% [  x0 M3 c
  26. 9 {' {, l6 }% r2 ?- }
  27. Parameters:
    ' a, J  c7 N& X! D3 U6 G
  28.     无  d3 W+ _& _) f6 B4 j# t
  29. Returns:& s1 ], Z! ^8 Y8 x/ ~! ~1 w, ?
  30.     无
    8 r$ i) d! E) p- i* h# {; X
  31. """
    9 p5 I( ?' \9 F; Y! F
  32. def plotDataSet():( ]+ C# m  M6 z& E; ]- s
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    ) R* d& |! r6 G3 K1 Z8 X( G
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
      p6 `\" n( k* i% p& |& y% J9 |- B. @
  35.     n = np.shape(dataMat)[0]                                            #数据个数9 n# t1 J9 G! ?8 _
  36.     xcord1 = []; ycord1 = []                                            #正样本
    ) }4 ?& I\" ]/ s
  37.     xcord2 = []; ycord2 = []                                            #负样本
    \" U' u. ~* ?5 Q1 V' [+ c
  38.     for i in range(n):                                                    #根据数据集标签进行分类* ]/ F% B6 ]: j: ]. F0 N0 l
  39.         if int(labelMat[i]) == 1:) F  _: X# r+ n1 ]+ P6 f
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    7 r* h- T4 \# x4 M5 p& z& A3 |
  41.         else:
    & f4 {) n: }( x8 ?/ Q5 Q% p3 B
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本6 l/ ^) H9 S% w
  43.     fig = plt.figure()
    ! r( g7 Q9 ^* D8 ~9 Y3 J+ ]
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    ) a3 A8 y3 k! Q+ X) c1 _% L1 b
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    2 o! ]; Y! n, |8 g
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本9 C& D, g& [7 K# v
  47.     plt.title('DataSet')                                                #绘制title! \4 g; P5 S8 K7 A, u( b7 U5 Z
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    $ E7 p: K  T9 A- A! |$ s
  49.     plt.show()                                                            #显示
    $ L6 q. t; ^\" H1 p1 H( w

  50. : k# k5 O& o$ C* K3 k1 }1 P\" `
  51. if __name__ == '__main__':* V2 Y5 M* m1 Y3 j
  52.     plotDataSet()
    & G- h! x# j0 A) g! o2 e3 E' w5 U
复制代码
VeryCapture_20231130171817.jpg
5 g1 K! Q8 c$ j4 s) a; p% g从上图可以看出数据的分布情况。假设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
    ! `+ }( f; \7 H$ X: q
  2. , ^( ?; [( p\" `' {3 N
  3. """
    ! Y9 a% }3 V# p+ Q9 ^) b
  4. 函数说明:加载数据
    + X- }9 g8 ]+ r+ J$ g; n. N

  5. ) T  s7 n; g. |; U- h6 A
  6. Parameters:  H! n, J, ?1 T. N, m2 ^
  7.     无
    / z\" |' N+ N! N2 D$ _6 P
  8. Returns:
    2 P$ H* M1 R1 i. \% G7 ^$ ]
  9.     dataMat - 数据列表
    9 @% p0 K3 v$ z
  10.     labelMat - 标签列表* {' i# A- U4 f- y  {
  11. """* ]% E4 x, g8 c9 Z! U) m
  12. def loadDataSet():
    4 C3 L2 H# Y' }7 |' j
  13.     dataMat = []                                                        #创建数据列表- D+ H9 \\" Y, L4 ~/ j: h
  14.     labelMat = []                                                        #创建标签列表
    ! H5 E7 `* j* K9 ~8 V\" m
  15.     fr = open('testSet.txt')                                            #打开文件   
    1 h3 B0 }) K3 Z0 }$ u& ^- k
  16.     for line in fr.readlines():                                            #逐行读取0 ]# y! v# N  Y* F
  17.         lineArr = line.strip().split()                                    #去回车,放入列表- M- Z\" Y8 d\" b! O: I
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据  H$ F( p\" b0 V' R* C: O
  19.         labelMat.append(int(lineArr[2]))                                #添加标签2 s9 T$ m5 R; f6 u! a2 D) z( o) X. x
  20.     fr.close()                                                            #关闭文件
    . t. b8 M( P# b4 b
  21.     return dataMat, labelMat                                            #返回
    ; y# x$ Z% h! p! v
  22. * D/ Z$ C$ @. q0 T\" G
  23. """8 G# d8 c* }9 @4 R
  24. 函数说明:sigmoid函数
    8 u4 g0 e  g0 ]

  25. * n- f& L) s% ^$ R9 H5 X; Y4 \
  26. Parameters:; O! q8 S* G. m! g4 G8 e
  27.     inX - 数据
    ' C\" p9 E0 u/ B$ G7 k) R
  28. Returns:
    - i; K' j7 `; m; a3 k
  29.     sigmoid函数! A\" A5 e# w1 ]  X; i0 j
  30. """, N7 r# w% Q# d! Z: ^7 K/ b
  31. def sigmoid(inX):
    3 E  [' i0 H: q. W. T
  32.     return 1.0 / (1 + np.exp(-inX))( {1 c8 U  z  e6 B
  33. * O; P- l! V) Q- x

  34. 0 L( B% C3 C  m8 f' ]/ j4 D
  35. """: ]. v1 J  Y2 J% f5 |4 n; {
  36. 函数说明:梯度上升算法% ]' a& E, Q: b; x) i

  37. * _7 N* a. l* l+ i
  38. Parameters:
    2 e  ~) e  E$ L, `' T& ^* j
  39.     dataMatIn - 数据集
    . s3 s2 i& k+ |/ Z
  40.     classLabels - 数据标签/ K\" e1 w+ Q' ^% y# m4 b: L
  41. Returns:6 o% D- W4 c; E% b1 L
  42.     weights.getA() - 求得的权重数组(最优参数)
    3 {0 B2 E8 b/ t
  43. """
    6 X- I0 e: I& W( L  e: o
  44. def gradAscent(dataMatIn, classLabels):- A0 B+ s. Q7 f
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat, L. w, h! U5 e\" Z
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置+ ^# O) D8 s3 ^! Z- K/ \
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    , T  h8 T- l# }5 p
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。+ ?) \) B! \1 z; d- t) j8 O
  49.     maxCycles = 500                                                        #最大迭代次数
    ' z$ ^! R7 ]/ e/ ~1 s
  50.     weights = np.ones((n,1))- z- d& l, T! p
  51.     for k in range(maxCycles):
    - _8 X4 h9 b1 [) ]1 T! Y2 E4 P) W
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    - X7 {& R- G0 X* O1 Q' c
  53.         error = labelMat - h
    * V3 E/ A$ l0 T1 [
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    & b7 x( F0 }5 C  n) q: z
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    ) D% b7 y9 M& C
  56. - m: y/ Y\" h7 A5 Q* l
  57. if __name__ == '__main__':! M4 E; p% B& x6 M  V
  58.     dataMat, labelMat = loadDataSet()           3 r) A; _1 Q; b! Y
  59.     print(gradAscent(dataMat, labelMat))
    4 d% C- n! @: ]& p5 ?* c; R
复制代码
运行结果
  1. [[ 4.12414349]
      a1 S6 ^! p\" @4 m; ?  `
  2. [ 0.48007329]
    ; h7 l1 ~1 R1 Y$ f8 o* O5 V4 `
  3. [-0.6168482 ]]
    \" ~\" a$ I) }% _. x# Q
复制代码

6 W8 ~" g( K) H/ W- j- B! |* b+ |
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 15:07 , Processed in 0.425988 second(s), 54 queries .

回顶部