QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |正序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    % t% w. D6 d\" R3 p0 @
  2. 函数说明:梯度上升算法测试函数\" O\" t+ D- L! r# `8 |4 K1 W! p

  3. % z8 \3 l9 T7 V  p2 k) w* Y
  4. 求函数f(x) = -x^2 + 4x的极大值# L8 ~- Y* j& N4 r5 @: `% A* T
  5. 2 `6 Q2 D+ z3 ~! q2 o/ s6 f
  6. Parameters:
    1 V) C* P8 n9 ?7 c
  7.     无
    & k. ~1 e; w$ D! W5 L4 Z5 I
  8. Returns:, l( z- H: [3 B6 j7 ^# I5 A
  9.     无4 P; E+ X6 I2 ^4 e, E' f9 G- F
  10. """
    / \3 F0 e; i( L3 e/ x+ \
  11. def Gradient_Ascent_test():
    & k5 [4 t( j1 t* Z/ b
  12.     def f_prime(x_old):                                    #f(x)的导数
    4 Q- h: ~$ Z6 G5 {/ h* F- D4 D5 p
  13.         return -2 * x_old + 4
    2 o- P( e9 q# K9 O
  14.     x_old = -1                                            #初始值,给一个小于x_new的值( n\" _\" d) J\" s7 r
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始- L# m( y! Y1 [3 c3 V$ o
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    # U# g# {/ L# N2 o/ o
  17.     presision = 0.00000001                                #精度,也就是更新阈值- W& z6 H1 r6 \9 Q' T
  18.     while abs(x_new - x_old) > presision:
    * Y$ N\" \! \+ Y7 r
  19.         x_old = x_new0 B% Y\" q2 A) J
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    ; b! D# t& i+ G3 v/ y
  21.     print(x_new)                                        #打印最终求解的极值近似值
    . C, i3 t& J8 S\" \2 V

  22. ( u$ h. B& g  [
  23. if __name__ == '__main__':% J  z\" j, a4 G$ L
  24.     Gradient_Ascent_test(). {7 c\" p3 E6 {! P
复制代码
运行实例:
  1. 1.999999515279857
      a: l- i' s+ j; U- F
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  07 I$ E, J6 X- @: A; {4 c
  2. -1.395634  4.662541  1. ?) M* Q\" ^1 h! q
  3. -0.752157  6.538620  0
    6 F% q/ Z6 x; b, c
  4. -1.322371  7.152853  0: {& G$ u( B+ v( W; v6 x+ P
  5. 0.423363  11.054677  0
    6 a% n9 Z( ?\" ^8 S  |! J6 ~
  6. 0.406704  7.067335  1
    4 c\" e( w* w5 e\" A* K/ }
  7. 0.667394  12.741452  0; x' r2 Y\" A4 U$ j8 \
  8. -2.460150  6.866805  1
      A; v2 Z7 D3 i/ V# F4 r
  9. 0.569411  9.548755  0
    $ j( F% N3 b# Q$ D# b
  10. -0.026632  10.427743  0
    2 \* |  C0 k  P0 d4 k3 C& M
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    ! w1 `# |. I$ o- s
  2. import numpy as np0 B- l; Q. V+ n# f3 r  n7 W\" A6 A

  3. : P6 z6 X( [# @2 U- u) ^5 H6 D
  4. """
    : |( M* ?1 o9 a6 `! W) q* S
  5. 函数说明:加载数据2 B$ V1 ?1 d3 t8 V( g
  6. $ c& G# s1 a$ j4 [3 s
  7. Parameters:
    ! @: Z* B% P; d0 C( o
  8.     无
    : U' L. P* E  @- X% H
  9. Returns:* z2 e& Z* W  A/ w\" O0 Z; W
  10.     dataMat - 数据列表7 [& H, k0 U2 T/ N! H5 N' K6 p
  11.     labelMat - 标签列表, V5 n! o6 f# F3 x* `
  12. """( [4 ?+ t4 f% P: H5 I% |
  13. def loadDataSet():
    # a$ _9 d0 o3 R
  14.     dataMat = []                                                        #创建数据列表
    $ l5 [- D0 A  `6 ?( X+ l7 N* b
  15.     labelMat = []                                                        #创建标签列表
    6 }$ m0 ?' T* I7 a/ T0 Y* q1 ]
  16.     fr = open('testSet.txt')                                            #打开文件   , ~* [+ Y* u, p1 R
  17.     for line in fr.readlines():                                            #逐行读取
    9 p2 ]9 T' r, c* C! \\" e
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
    1 Y  Z) p9 f. `, t) ~5 z. `
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据7 a/ Q( {# N7 X+ r: F7 \' t
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    8 i8 R4 K' `) z. e7 ~  P- g
  21.     fr.close()                                                            #关闭文件( j, l1 J) b1 _- W- _: n$ X
  22.     return dataMat, labelMat                                            #返回! i% c) j. Z. ]6 A! J
  23. \" P\" a1 T* \$ _2 V+ F
  24. """. i0 O3 p) q+ E) c1 {
  25. 函数说明:绘制数据集
    6 E2 m1 C+ F1 J+ Y6 I5 e7 j

  26. 1 V! J/ w- d. _# o  y
  27. Parameters:
    : d; ~4 c5 F# L
  28.     无# s/ S- E% o) S3 i5 m( W9 ?5 S& y
  29. Returns:
    5 Y/ b3 T, k3 ~& e, P; `3 L
  30.     无
    : E- X, m  ]( E4 ?
  31. """
    ! f5 [7 P4 ]2 ?7 ]% [
  32. def plotDataSet():
    # D! @& l# [- N# C& z0 N0 z( I* a
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集0 W4 W8 m8 s, [: e: z
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    $ k! {7 U* D* Y1 o7 q
  35.     n = np.shape(dataMat)[0]                                            #数据个数4 d# D2 X9 Q0 @3 u/ D6 o1 n
  36.     xcord1 = []; ycord1 = []                                            #正样本
    & D$ x4 H$ V% S3 _
  37.     xcord2 = []; ycord2 = []                                            #负样本
    ) z* `8 U1 S. A5 c7 F8 q\" N
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    8 e; U3 W\" r9 f$ H. O' W
  39.         if int(labelMat[i]) == 1:$ u# P# ?( ~4 [7 \4 |% \+ V
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本0 U: G1 ]* W& z& B; {! Y; h
  41.         else:\" X6 Y8 D9 y! [. w  B5 o$ T
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本, j/ [* C\" W1 {; v2 I\" Y
  43.     fig = plt.figure()5 E* e1 a% x8 @$ c
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    7 p/ K  L6 T. x% G+ g- A- h: j
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本5 n1 Q' h1 r6 v1 }3 l
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    / [. A4 e8 y1 \, z0 b5 @\" q; q
  47.     plt.title('DataSet')                                                #绘制title
    \" ^: S+ _! J* `( n+ v
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    8 s; n/ {. l; @: U
  49.     plt.show()                                                            #显示
    ( }4 b1 q; J+ p; y; ?

  50. 9 w( s/ I: ~\" P: c9 u5 c: e
  51. if __name__ == '__main__':: s4 R# ]\" `2 M) e
  52.     plotDataSet()
    ! D) N4 b; ?# \$ n) m3 Z
复制代码
VeryCapture_20231130171817.jpg
( k1 N" l6 N- }5 B2 a7 L从上图可以看出数据的分布情况。假设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, E. Z! I) s) y
  2. \" N, x) ]6 r' D; |. g
  3. """' x% a1 Q, p\" v1 M1 U# t# l  P
  4. 函数说明:加载数据& K/ d2 K! J9 I: i' U9 t* I

  5. / K3 R( C+ Y$ u
  6. Parameters:' g6 O0 w, z  p/ W2 J+ \9 |8 M$ e% p
  7.     无( f4 J1 q$ `\" B\" G! K8 V, M* T. P
  8. Returns:
      Z. \. V8 n! Y
  9.     dataMat - 数据列表$ h( P0 ?  A, L. x
  10.     labelMat - 标签列表- b& ?7 J/ I. I7 Z! ~8 F
  11. """, Y2 t( s* e$ @& p( Q
  12. def loadDataSet():
    1 \3 R  E3 c# ]
  13.     dataMat = []                                                        #创建数据列表
    ( F4 E7 m9 c8 v8 _6 k# U, ^( k
  14.     labelMat = []                                                        #创建标签列表3 e  h/ `: w; q, ?
  15.     fr = open('testSet.txt')                                            #打开文件   
    ) n0 O# b3 B1 J' _0 E4 S5 m3 U  Q: k
  16.     for line in fr.readlines():                                            #逐行读取$ y, A. j9 [% ?5 ?6 w\" F
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    4 t2 E1 J( L. W2 t- _9 C4 u
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    7 C( |# b4 G; ~
  19.         labelMat.append(int(lineArr[2]))                                #添加标签\" g+ X* |% q4 r4 M5 x& U  L
  20.     fr.close()                                                            #关闭文件* _* w3 `* l5 }; D3 k- P2 K* T% ^8 g
  21.     return dataMat, labelMat                                            #返回
    / @: d/ L5 F- p
  22. $ B/ C( m& h% `: A/ e$ W' ^
  23. """
    9 r- d  w9 Z' M$ t
  24. 函数说明:sigmoid函数\" r( i3 t6 E0 c8 w/ B* C

  25. 6 f. H\" @( X* H9 L1 Z
  26. Parameters:. t& F! P$ |$ r\" U3 D, O# R1 _
  27.     inX - 数据' i, v3 Z) L* O$ W
  28. Returns:# g- y* L+ N$ i
  29.     sigmoid函数
    8 z1 m7 u. a% k7 a
  30. """
    * Z! e# T* Y* t  x+ S) }
  31. def sigmoid(inX):/ W( x5 [  R7 S3 X* _5 ^; {  j
  32.     return 1.0 / (1 + np.exp(-inX))+ r8 d. J  C! Z4 T5 H

  33. 6 A' v0 k4 `2 H, F' `# F\" @
  34. 1 o+ f6 R) ~+ @1 o\" ?
  35. """, N$ b( E# Z\" J3 O9 K2 y
  36. 函数说明:梯度上升算法
    2 z( K4 Q& z4 [

  37. 9 o$ x8 r8 r6 o\" o4 X: x2 x/ `
  38. Parameters:
    . t6 Q4 p6 }$ Z# R2 H5 L( ^) z
  39.     dataMatIn - 数据集
    ; f9 [- s- O9 M! D  Q, U% E7 i
  40.     classLabels - 数据标签. }' {+ Z% E) v8 k2 |) s
  41. Returns:
    / N- \2 O9 _, u; _' w
  42.     weights.getA() - 求得的权重数组(最优参数)* s- l( E8 Y5 ~+ @0 k
  43. """
    / X* T& s  s9 X2 H
  44. def gradAscent(dataMatIn, classLabels):. L$ g$ K  U2 J
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat. x5 {/ g) O6 n. n4 w0 h: l
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置# Y* k7 B, m! g7 I$ p
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    # O, Z6 ~+ k& G1 g, P* P' n6 E
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。: t& `# A$ ^9 C  b8 Q( s% x/ h
  49.     maxCycles = 500                                                        #最大迭代次数2 O4 w  H4 O  D. Z4 {
  50.     weights = np.ones((n,1))6 Y) B7 j- t) f7 z; A2 N- t/ f% Y
  51.     for k in range(maxCycles):/ d7 e8 r\" Q: \. `( J. z
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    4 D5 }- ]* S; A/ t+ ?* P: t
  53.         error = labelMat - h
    , n9 B, Q* t! Q7 x6 e7 x4 p. v
  54.         weights = weights + alpha * dataMatrix.transpose() * error. X8 E1 `$ ], ~3 ^# P8 b
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    8 |% I. ^8 \, o

  56. ) |$ Y& y, x, x+ {: K
  57. if __name__ == '__main__':
    9 A$ j3 W. o0 \( w2 v\" F3 y5 c
  58.     dataMat, labelMat = loadDataSet()           # d- F: R* E9 x/ T0 v3 Y
  59.     print(gradAscent(dataMat, labelMat))6 O2 j' U1 v* D\" ]  c' r6 f; ~
复制代码
运行结果
  1. [[ 4.12414349]
    ; [$ p; S# S6 ^
  2. [ 0.48007329]
    - o8 a; ^9 u3 {6 j9 t
  3. [-0.6168482 ]]4 c, `! B' f! L; H6 p0 ^: g
复制代码

" s& S. Q. A; P: i2 _" Z
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-7-10 11:27 , Processed in 0.385549 second(s), 55 queries .

回顶部