QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |正序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """# B1 l8 }4 Q- b
  2. 函数说明:梯度上升算法测试函数( @9 m& M% T% O' A1 p0 N5 K
  3. & ^8 q3 u& n% }
  4. 求函数f(x) = -x^2 + 4x的极大值. [' }0 x0 A- g\" v

  5. ( ?2 L0 p9 F% w( ~0 ^( k' V2 h4 A\" t
  6. Parameters:& X) l% J$ r& `* ~
  7.     无0 o, Z5 G  `+ Q/ W4 |, a8 `
  8. Returns:
    \" H+ W/ w! `! _2 @
  9.     无2 U( r2 H/ d5 M- X) n/ O3 V
  10. """& o6 r$ u3 s0 ]/ E( X7 |* i
  11. def Gradient_Ascent_test():, e1 X6 l0 S6 {  M, G  b
  12.     def f_prime(x_old):                                    #f(x)的导数
      j  y: N6 f  P3 A; n
  13.         return -2 * x_old + 4
    * K, V; m1 p9 r+ D% ~
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    ) I2 K. R) g: g( y\" k+ h3 C! E\" u
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始: ]* n# u( ~9 K2 s( }6 F
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度4 J) T. \3 E$ ^, o3 z/ W9 N& Q
  17.     presision = 0.00000001                                #精度,也就是更新阈值9 `/ ?% x0 S5 P7 F; w
  18.     while abs(x_new - x_old) > presision:
    , r1 G\" J# H! o6 R+ f
  19.         x_old = x_new: N1 k& h- W- P1 b/ U1 `0 @! C
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式, S! J) J$ q6 m4 Z/ v1 w8 W
  21.     print(x_new)                                        #打印最终求解的极值近似值
    * d1 A$ o+ `8 w, V+ q
  22. , n& ~1 p' e, i+ N
  23. if __name__ == '__main__':
    ( R, \; p$ }% Y) m\" ^8 ^
  24.     Gradient_Ascent_test()$ {9 p7 J0 e0 S* B+ t
复制代码
运行实例:
  1. 1.999999515279857
    7 v2 K  ~# y7 v+ a7 d3 q0 Q; i
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0& \2 o! ?- c8 u, e6 R% @4 s& H
  2. -1.395634  4.662541  1
    0 q: {& M0 L& p# A) ^5 s1 t1 U
  3. -0.752157  6.538620  0
    ( Z) G5 T6 F# j8 N- e0 l: R
  4. -1.322371  7.152853  0
    2 q5 F( l5 R2 N9 q
  5. 0.423363  11.054677  0
    . w; W' I0 X  ?2 g
  6. 0.406704  7.067335  1! Q+ n( B' Q- L+ Q- W# ?6 h2 X
  7. 0.667394  12.741452  0
    # R& L( p* _; H8 A- R8 U
  8. -2.460150  6.866805  13 z! y+ f+ x& m5 Y5 j' i1 l0 I
  9. 0.569411  9.548755  0
      _% }2 ~  y- I! t
  10. -0.026632  10.427743  03 G* u1 Y  u$ |
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    ) _0 d/ g3 Z) Q7 `5 j+ {1 x. z
  2. import numpy as np4 I& h  ]9 r) ^8 \9 {% Y; G; l

  3. 0 c$ p3 K; n/ f8 S5 `
  4. """; K( q) J+ |# f- T. J6 a# B
  5. 函数说明:加载数据) H$ w2 E1 {( D/ k2 O

  6. ( G' `( H' G6 n! Q
  7. Parameters:) R; J. s+ ]' a( G5 c
  8.     无$ S% Q6 L! S# h8 b2 i. ^
  9. Returns:
    - O: B/ {0 N1 ?\" Q
  10.     dataMat - 数据列表7 e\" W\" y# K; {: M2 _
  11.     labelMat - 标签列表% g. m8 g7 W5 b9 h  e1 p\" ?  j
  12. """1 g0 M4 }$ U( S  t, T. F8 B/ Z9 ]
  13. def loadDataSet():% q/ H! S9 J& j* z1 g
  14.     dataMat = []                                                        #创建数据列表, t- L* p. [0 t, B5 Q
  15.     labelMat = []                                                        #创建标签列表. T# H6 S  M# m) W8 G
  16.     fr = open('testSet.txt')                                            #打开文件   
    & b6 K8 X* Y1 p2 [# y% ?% E
  17.     for line in fr.readlines():                                            #逐行读取1 z7 z4 C% f\" i2 [! `
  18.         lineArr = line.strip().split()                                    #去回车,放入列表& {! {$ J4 C& ~$ R+ o  W
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    & r, r9 P. @( \6 \! @9 e
  20.         labelMat.append(int(lineArr[2]))                                #添加标签( k3 M, C& F. U# G. t
  21.     fr.close()                                                            #关闭文件
    + r\" `3 r) G3 p\" \4 K' f$ @
  22.     return dataMat, labelMat                                            #返回1 p# u3 Y$ r( v5 X$ u

  23. 9 ?) D, w# b) ?8 u/ B( ]. l0 s
  24. """
    4 `6 `% k5 ]- r. V2 v' J
  25. 函数说明:绘制数据集
    8 Q0 ~8 k* Q) m3 B\" ]9 B

  26. - `* L  J6 l( K3 n' n3 S
  27. Parameters:; y! p) R; D% X5 v
  28.     无4 [/ ~- S5 m2 _+ t
  29. Returns:
    & ]/ B5 x( {4 \' i* _' C
  30.     无
    , p1 C( S! d) i- X& [) Q
  31. """& r2 F0 V5 B- C9 ^\" D0 k7 Q: d
  32. def plotDataSet():
    ' ]1 _, ], i' o$ p8 w  i! C
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    - r6 B9 ?) E3 q8 w, s  l: ]
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    ( L9 M* i( e8 T  ^/ T- }# s- a  K
  35.     n = np.shape(dataMat)[0]                                            #数据个数6 f2 h' e& _6 ^8 G. i9 ?! `
  36.     xcord1 = []; ycord1 = []                                            #正样本
    + p  R' d# o7 l
  37.     xcord2 = []; ycord2 = []                                            #负样本& r7 V$ e\" j2 _. I, Y  y
  38.     for i in range(n):                                                    #根据数据集标签进行分类4 Z  m5 a& i5 i) r  l9 `% J
  39.         if int(labelMat[i]) == 1:0 z- q) r8 [4 T% I. _
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本9 t: q2 X& y. [' N! Y
  41.         else:2 D2 \, F7 s' Q. R: N
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    6 @) k2 N9 h/ }# K: Z
  43.     fig = plt.figure()) `7 R1 V+ D) M* Y: g7 Q- L# T! x
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    3 s5 T, o2 J\" G0 Q
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    : M( t/ C! Y2 M' z$ ?0 x& x  S& B
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    7 u) Y5 X& J9 ~( J9 t% V2 I\" {$ e: V
  47.     plt.title('DataSet')                                                #绘制title
    / ^( l8 y) Z; `; ~4 @8 n2 S& j' d) C
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label& }* g$ Q* j' ]% c% b4 I
  49.     plt.show()                                                            #显示! M  B  @* C4 C* n
  50. 4 ]\" g\" o. l6 J
  51. if __name__ == '__main__':
    - M7 w. P9 }6 x. R4 _- @/ f
  52.     plotDataSet()
    9 V. t  A6 P% d\" z
复制代码
VeryCapture_20231130171817.jpg
2 X  a7 W5 ]. P0 K$ u从上图可以看出数据的分布情况。假设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
    ) S6 ^% }8 t; a, R3 A
  2. . [& D1 J9 m% \
  3. """
    % ]) I& Y4 @$ @$ D* y
  4. 函数说明:加载数据
    - J. h4 l; i2 C3 E2 Z9 E

  5.   h+ ^5 x7 Y8 e\" J; K
  6. Parameters:* _4 [! s4 G3 [5 D# I
  7.     无
    5 L; W2 {6 A2 Y4 i
  8. Returns:
    3 L7 c) I$ o3 P  _! s( p
  9.     dataMat - 数据列表3 {& p8 G  s- F$ E/ }
  10.     labelMat - 标签列表
    - i2 q% o; h) N1 E2 `% u) `
  11. """
    7 L# m& r% Y* N+ c  ^) M: h
  12. def loadDataSet():
    . U: p# A0 v# L( e3 F) B* W- k
  13.     dataMat = []                                                        #创建数据列表, Y/ X! {& ?6 h2 k# R1 s' H
  14.     labelMat = []                                                        #创建标签列表
    \" n# {0 s. m5 h% L
  15.     fr = open('testSet.txt')                                            #打开文件   9 C: M. f/ a\" P- t
  16.     for line in fr.readlines():                                            #逐行读取; r8 `! h$ s7 n' |% K/ a& H
  17.         lineArr = line.strip().split()                                    #去回车,放入列表) b, p9 `4 e. K3 `4 E0 ?! ^
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据9 N# ]/ U6 D, E# F/ j
  19.         labelMat.append(int(lineArr[2]))                                #添加标签\" _1 b, l3 b0 O0 F/ G' W+ q/ H3 s6 R\" L
  20.     fr.close()                                                            #关闭文件
    & @* a\" u- {! h( V# f4 d/ x) R3 q6 \
  21.     return dataMat, labelMat                                            #返回
    . h7 J; r8 w( M' A
  22. & u- e( t3 S& c% e! a2 \) h
  23. """' |5 o8 j1 H7 W2 }: H  t8 F( }
  24. 函数说明:sigmoid函数
    * \1 x( i5 j# @) O, _; ^+ I
  25. 6 y0 e* b+ m) h; x( A6 a/ K. w
  26. Parameters:
    4 i' r5 O3 B$ |0 s6 x( j$ e  K. @
  27.     inX - 数据- d( w5 ?  |+ D* K4 |, |0 U
  28. Returns:! p1 f+ E* z7 ]$ H7 r: J$ v% R
  29.     sigmoid函数7 I! h0 D2 R# _& k7 K6 H8 e
  30. """
    2 [7 G4 ^1 l3 {9 M+ M
  31. def sigmoid(inX):
    % N+ `% b1 F& \; x8 D1 I1 N
  32.     return 1.0 / (1 + np.exp(-inX))$ \3 }4 O, N; E1 \) t; p/ c

  33. ; }* u9 n1 P/ j  o, A  j\" H

  34. ' E8 O' I8 a4 D; J
  35. """3 @8 [3 Q3 M8 O6 q: m6 Z' F
  36. 函数说明:梯度上升算法
    , x. Y! {/ ~. }3 l- J7 M9 \# _
  37. $ o; K/ M! e/ x5 f- w# S+ f
  38. Parameters:
    & Q1 ~# q) l1 J& H- F  O: |; q9 z
  39.     dataMatIn - 数据集
    3 V\" g) u* _$ k, B
  40.     classLabels - 数据标签$ t8 b. w( p$ A  G* v8 F+ ]
  41. Returns:
    ) Q) Z( C- ^6 |0 y6 w
  42.     weights.getA() - 求得的权重数组(最优参数)
    1 ~1 N; S- ]8 O9 r
  43. """9 c, K1 O8 I' k. o3 V
  44. def gradAscent(dataMatIn, classLabels):7 V- v* @* }0 j/ q
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    % |* ]6 b7 j7 v& \/ O
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
      K8 U1 ~  Q6 b' z- k) H9 k7 Y
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。% Y5 j0 n7 w4 v0 ?
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    6 T0 n9 j  T4 ^7 r  ]  l6 ?3 S
  49.     maxCycles = 500                                                        #最大迭代次数
    $ O  ], Q2 n# @* [, O2 D4 L$ W! y
  50.     weights = np.ones((n,1))! N0 `! i8 M5 j
  51.     for k in range(maxCycles):9 H; k9 N  H/ y2 J( R
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    7 h3 u# d6 p3 R. h& d
  53.         error = labelMat - h
    / w1 z! D/ h3 |* e1 G
  54.         weights = weights + alpha * dataMatrix.transpose() * error. O2 m+ ?. M! P5 W3 {9 L
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    \" S& G. S! p\" ^( w  e. C
  56. ' b1 K8 ?5 @% e$ D7 r
  57. if __name__ == '__main__':
    + l7 \) f. x9 `
  58.     dataMat, labelMat = loadDataSet()           
    : m$ E, |# C; K
  59.     print(gradAscent(dataMat, labelMat))0 [5 _* z4 r1 ]* x; i% O+ c5 ]\" N
复制代码
运行结果
  1. [[ 4.12414349]# _- w7 _) T7 O* Z5 y\" P5 s, N
  2. [ 0.48007329]
    3 b) M! l9 P; m7 W0 T+ |
  3. [-0.6168482 ]]& I# |3 f6 b# c+ U3 ^* h; \\" o
复制代码

& E1 p4 D; b) L$ P/ l& B0 ?5 `. {
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 03:50 , Processed in 0.424156 second(s), 60 queries .

回顶部