QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """- n\" X% d/ M9 S1 z& P4 V
  2. 函数说明:梯度上升算法测试函数
    # e1 w$ N; \5 _* v4 O: ~7 z, b7 z. G

  3. ) G) D5 u: o6 u3 E# v
  4. 求函数f(x) = -x^2 + 4x的极大值
    : v  Z3 A8 y0 S4 _
  5. \" m+ ~+ E  B% l4 y6 o! [
  6. Parameters:' o- T/ H+ {# N+ r1 B' u& M% j
  7.     无
    # K# k' ?! b8 z6 W0 @2 O
  8. Returns:0 i/ B  j& U8 ~
  9.     无
    * O- D/ P. H; g' a. e' V
  10. """3 O) W; F4 Z4 @2 G8 ]
  11. def Gradient_Ascent_test():  I/ B3 A5 L# E1 s
  12.     def f_prime(x_old):                                    #f(x)的导数2 g4 Z9 ]1 \0 g% A3 `) X
  13.         return -2 * x_old + 4! g# G. \  |. N. D3 M
  14.     x_old = -1                                            #初始值,给一个小于x_new的值5 A4 @( J0 @; e7 v1 A# U$ C
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    % C' U  T2 L2 g; [! i
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    $ V, o, T4 J  Q* r
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    % |% C' Z! P* U0 F- ?7 J/ ^4 d
  18.     while abs(x_new - x_old) > presision:
    : ]- J6 _2 ~& E
  19.         x_old = x_new6 M- f- t$ _% t7 g& j) J
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    0 {1 Z( L6 g8 Y: N) m
  21.     print(x_new)                                        #打印最终求解的极值近似值! z) ?7 r+ `, k7 Q
  22.   T' V1 s& ?- P1 t: s9 R
  23. if __name__ == '__main__':
    8 A2 q% H* k% w' [/ V3 @: t
  24.     Gradient_Ascent_test()
    + ^# Z$ [7 y7 s( J- {
复制代码
运行实例:
  1. 1.999999515279857
    9 Y0 M8 T: ~% p7 @3 j% O# y. n
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0\" D8 |, S# N' S. o4 X- X* ]
  2. -1.395634  4.662541  16 ?; g\" X6 _# `& z: c0 ]6 E, G
  3. -0.752157  6.538620  0
    1 @! _3 g6 ]: U7 q' @% \5 m
  4. -1.322371  7.152853  0+ i; i8 R& f0 o7 ]7 t
  5. 0.423363  11.054677  0
    , k4 e( S9 L5 T
  6. 0.406704  7.067335  13 U# w: V' K- s' p, v
  7. 0.667394  12.741452  02 p# X8 W7 [# s$ n' r
  8. -2.460150  6.866805  1! ?% _7 Y3 y2 }# g% ^\" @
  9. 0.569411  9.548755  0
    4 V3 _* @+ z1 S5 j\" ]
  10. -0.026632  10.427743  0, @( \! f$ x- a; m+ o- K
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    0 R& W8 |' o. m
  2. import numpy as np5 s5 Z& \7 }+ }\" D
  3. ( a& g. r# p6 [8 I\" l
  4. """4 O3 @7 A  a% V4 t8 U\" q% C8 ~
  5. 函数说明:加载数据6 E+ t3 u* q3 Z* F9 E% C2 {

  6. : J# p1 z) m$ h1 ^
  7. Parameters:
    ( I: `  Z9 n+ g8 R\" A) z
  8.     无
    3 q8 }. J! b2 o/ X; g
  9. Returns:
    . h) N; I\" I# R+ O
  10.     dataMat - 数据列表
    $ [9 ]  ^8 N\" }7 e) ]+ j* k
  11.     labelMat - 标签列表
    ! x\" @3 [* z3 k4 H7 R
  12. """
    5 p' Z0 Y7 a% x8 o; c+ X
  13. def loadDataSet():: Q8 u! n+ ]3 T) A: m
  14.     dataMat = []                                                        #创建数据列表9 f! {( t. W8 j9 x' a$ H2 L2 W
  15.     labelMat = []                                                        #创建标签列表, c7 D% u  F7 \4 n2 a2 @
  16.     fr = open('testSet.txt')                                            #打开文件   % [$ ^8 @; m+ ?3 m0 I
  17.     for line in fr.readlines():                                            #逐行读取% V* X( t7 n( K; m
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
    9 `6 x  P- h3 ^3 A
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据7 T' I& F4 h& i4 \8 q7 u
  20.         labelMat.append(int(lineArr[2]))                                #添加标签- e  x& C5 U# Y  M' E8 I5 T
  21.     fr.close()                                                            #关闭文件1 z2 Q1 O: A, e. F. U6 Z; p0 v
  22.     return dataMat, labelMat                                            #返回) y: v9 F* W  ^. A

  23. 0 p, W# a1 a) T3 ]
  24. """+ V5 M- N: i6 V: V
  25. 函数说明:绘制数据集
    ) i. r9 S5 ?+ J+ ~$ \

  26.   s4 S) ~! Q4 B* F7 U
  27. Parameters:
    ! `. M4 d2 o% ~/ z# _6 b9 s  B
  28.     无% X* K- f. e7 p; O) M8 A
  29. Returns:% P7 G# h  U\" n4 y9 q
  30.     无
    8 W9 ~/ `  i# q
  31. """
    % n7 Y& I# E8 _. F* i+ P8 [; m* l' g1 U
  32. def plotDataSet():
    % F8 ^% s7 j4 F) ?) ]$ U
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集/ ]4 b; Z+ j; T9 H4 }
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组% H) t\" _$ A% A1 ~
  35.     n = np.shape(dataMat)[0]                                            #数据个数& T: j6 V: q9 J* Z
  36.     xcord1 = []; ycord1 = []                                            #正样本
    ) ~3 P1 O  \$ Z2 P
  37.     xcord2 = []; ycord2 = []                                            #负样本) Y0 J1 i) h2 [4 H( ~
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    7 k& b\" q( M7 `' q* w6 v
  39.         if int(labelMat[i]) == 1:
    2 S2 B5 {\" v! q2 [- R; s
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本4 n\" u8 t* \/ x\" L
  41.         else:/ l& W\" @$ {9 w6 n) }- N5 r& m
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本, J5 O' o9 U& `! Y
  43.     fig = plt.figure()
    7 Y8 m; k& P# Q
  44.     ax = fig.add_subplot(111)                                            #添加subplot, `; r2 Q. p* v/ J
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本% h2 _/ F2 Z- a/ v
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    9 o! D\" y& I7 j7 u0 {& t) n
  47.     plt.title('DataSet')                                                #绘制title
    9 d6 z6 ?3 A4 J# J
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label( ?0 r- |3 D. q$ S5 p
  49.     plt.show()                                                            #显示
    # c; ?$ u( n6 M7 M% F& E- K
  50.   x0 G, B3 D, F\" I  J+ j$ M5 n- U
  51. if __name__ == '__main__':
    3 Q4 t+ L* S; {, q, E! C- C9 P
  52.     plotDataSet()
    6 ^1 D! t- z$ u$ u1 A1 X  G2 M9 d8 ^
复制代码
VeryCapture_20231130171817.jpg 4 J0 [& O) T* I0 y4 z4 D& \
从上图可以看出数据的分布情况。假设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$ g6 O( \) Z9 {/ X

  2. 2 S- S0 z: a) |* t- y. O& \
  3. """. W) z. F3 H) J\" K5 x3 a7 j9 u\" Q% l
  4. 函数说明:加载数据7 m3 n- M9 X. b+ {# n) Q% }
  5. ! Y- F; x  s0 _
  6. Parameters:4 L3 A! c) l$ _
  7.     无
    . j- G& N7 f# l9 h3 ?
  8. Returns:
    9 L2 N$ ^/ S. y1 G3 h' e; J
  9.     dataMat - 数据列表% Q$ z' }5 q) L
  10.     labelMat - 标签列表! h5 H4 B; j8 B( o# P2 G  B
  11. """
    ( h& U4 R. Q! ]6 V& O
  12. def loadDataSet():$ A! f9 T# r. I\" w/ u# x4 ]; r( z
  13.     dataMat = []                                                        #创建数据列表' u8 r& z4 |; z! x
  14.     labelMat = []                                                        #创建标签列表. R7 M7 r$ P# d, r4 t# `
  15.     fr = open('testSet.txt')                                            #打开文件   1 m. i) t$ Q$ k& u
  16.     for line in fr.readlines():                                            #逐行读取1 N/ T\" l. Z. Y6 B% Q) f
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    ' w3 P6 m8 j; e
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据; x1 a# x$ _, x% x9 w3 |3 N4 ]
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    , ~; v6 u( f5 H1 Q8 w
  20.     fr.close()                                                            #关闭文件
    ' }( R/ Y  \, I* D7 r
  21.     return dataMat, labelMat                                            #返回
    8 |( A; U6 }7 y
  22. 7 A/ I. O\" c8 L. O
  23. """: r* g9 [2 h/ B2 m$ y# \* p
  24. 函数说明:sigmoid函数8 ?5 s7 c, A3 Y6 l: A, p- S# g

  25. * P- U2 i+ U, M9 C4 n6 q
  26. Parameters:+ w: `6 U& B: y1 v& W; t
  27.     inX - 数据
      C\" r. a\" z! A+ _& e+ X
  28. Returns:) P& p% W, z5 S; b8 E) O
  29.     sigmoid函数
    9 j: o1 I3 x& z) \) n; i4 O2 u
  30. """
    # b, }! c( ]( b) ^/ E
  31. def sigmoid(inX):
    - ?2 Z% ~; s\" L- O0 o3 e
  32.     return 1.0 / (1 + np.exp(-inX)), Q- b4 Q& _9 S\" x5 \/ _

  33. & j% J5 m/ \6 E! p/ B5 ?

  34. 6 l1 T+ E\" ^7 n  a1 \! |8 |
  35. """
    $ S: [+ b% {* W1 }7 d* t  Q4 P
  36. 函数说明:梯度上升算法
    3 `+ f7 t& z3 t9 a0 a
  37. 3 X3 v( r# C; n1 ?6 i
  38. Parameters:9 B* D! V) f, p& z* B4 A) }
  39.     dataMatIn - 数据集
    8 Y5 s3 h. l# K  P6 j. U
  40.     classLabels - 数据标签
    & D8 e' D4 b% R% X7 M
  41. Returns:
    * R\" d0 L$ o; `& Z
  42.     weights.getA() - 求得的权重数组(最优参数)
    ! w1 E- ]7 Z4 E8 ~8 k# n
  43. """5 c0 i  [1 t  |, {6 [$ U& \\" c
  44. def gradAscent(dataMatIn, classLabels):
    7 V2 s7 v% K6 i: v& V$ k
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    2 c% J/ _$ u3 a: H' O
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    / C# g: [. p/ j. X$ ^! \1 z' w/ v
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    / r0 @* x# Q0 [4 L
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    0 A5 |( R' j- u, }
  49.     maxCycles = 500                                                        #最大迭代次数& b. Q0 q- B  e
  50.     weights = np.ones((n,1))
    ; \& j; j$ ?/ G% b( A/ t9 Y
  51.     for k in range(maxCycles):$ e$ X: Z0 w* Q0 {( ?* X
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式( _) k+ @: O/ T: E3 g5 ]  l
  53.         error = labelMat - h
    - N( W3 d' P* u  A6 ~( \9 r5 S
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    5 }7 u% A* z1 M
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组7 h- T# \0 A6 V: y3 w. u! _
  56. 2 T+ m& i\" I' p8 r
  57. if __name__ == '__main__':9 ]\" G3 ]2 u3 x. h
  58.     dataMat, labelMat = loadDataSet()           
    / Z& R# w\" b/ `; U- J2 a9 s
  59.     print(gradAscent(dataMat, labelMat))% }\" [: ?+ {1 Q6 v8 I& `
复制代码
运行结果
  1. [[ 4.12414349]. H* n\" h. T* d
  2. [ 0.48007329]
    + k1 F0 U6 [( N5 o. U( q5 j5 Z. ]
  3. [-0.6168482 ]]5 z6 g& c  @% Y\" ]- k, I# w
复制代码
; O. d) ?, O- m2 @& e: |. L6 K
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-10 15:08 , Processed in 0.285236 second(s), 54 queries .

回顶部