QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """% @+ C4 d% |2 o- ^. S* }) Q& S; R
  2. 函数说明:梯度上升算法测试函数
    - f  B- k* Z& N3 F5 C  ]

  3. 3 q, S( S( q# O& t# ]. U8 z, C
  4. 求函数f(x) = -x^2 + 4x的极大值6 g- H; x% y5 I

  5. 6 Q& E5 |, I+ v\" [, \$ H! q1 r
  6. Parameters:
    + C; t, x3 C+ B: S# i3 M
  7.     无
    : m1 R5 K+ R) z9 L! w$ Z
  8. Returns:
    3 z3 c8 W; |$ G$ B( g+ q8 m2 \9 \
  9.     无
    0 k6 G* m+ J7 O# z+ Q# L4 J
  10. """3 t9 G1 Z1 P\" J1 r
  11. def Gradient_Ascent_test():
    ) _; R2 g  S& S6 |/ }' ?7 k
  12.     def f_prime(x_old):                                    #f(x)的导数$ M. k9 f% X  X' w
  13.         return -2 * x_old + 4
    . z; B$ `\" ]8 v: K
  14.     x_old = -1                                            #初始值,给一个小于x_new的值\" F' S9 [) V& x) V
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    7 n) z; y$ j  K! ]
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    ! W\" M/ U% L0 j5 Z4 ~0 B7 q
  17.     presision = 0.00000001                                #精度,也就是更新阈值0 ]9 X  N5 {  R' g
  18.     while abs(x_new - x_old) > presision:7 S' t6 q' X7 \. u5 e
  19.         x_old = x_new3 A0 u  q1 G5 C1 v; c, Q, S8 r
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    \" F  f: v' y- m7 w- C5 H) h1 \
  21.     print(x_new)                                        #打印最终求解的极值近似值
    ) D1 n2 @/ s, t% [9 T1 l/ M
  22. \" u5 N5 z\" d2 C) v& |
  23. if __name__ == '__main__':
    1 j; Q8 ~* E& ~4 {) @
  24.     Gradient_Ascent_test()
    ) F; c/ z  N$ |7 q6 v
复制代码
运行实例:
  1. 1.999999515279857
    3 R2 x5 X# ]$ P
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
      {1 a  R+ S0 j
  2. -1.395634  4.662541  1# N, D6 }% G. y' H/ M+ _  B
  3. -0.752157  6.538620  0$ ^0 F+ |\" M% l
  4. -1.322371  7.152853  0& S; @  u$ l. M, T3 O* M
  5. 0.423363  11.054677  0- X4 W; J: Z! f. L. N  s0 \+ A7 N
  6. 0.406704  7.067335  1
    ! p2 G; m/ |* {+ M
  7. 0.667394  12.741452  04 V1 Y# V  o, C- O* |
  8. -2.460150  6.866805  1) t8 S5 r; D. Z
  9. 0.569411  9.548755  0
    / [) p$ a% C8 ~) ]# _1 W
  10. -0.026632  10.427743  0
    # S( R4 w0 C+ d7 {9 F: J7 ?' h) g6 s
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    9 p2 F% O% o3 ~/ ^8 a; e
  2. import numpy as np
    / A8 s( ]: F; u, v. q' G4 e& f# i
  3. 3 a! T% ]* N( N2 k9 I0 A4 O- M, y! X
  4. """
    ; E2 r$ X7 f5 \
  5. 函数说明:加载数据
    - O3 h7 e: z1 O/ P1 F

  6. 9 d$ C- ?, o2 U) K5 m. H
  7. Parameters:  U2 r  G4 g+ R( e
  8.     无
    9 e: C$ A0 N. I0 G, a% J
  9. Returns:
    4 ]2 x4 L: [+ V\" r$ {
  10.     dataMat - 数据列表, m( V- U& N4 r; H2 z
  11.     labelMat - 标签列表
    ' R5 Y' O/ L4 A, y9 X
  12. """
    : G( G  l# {1 T\" P1 j/ L; ~. Q  ]
  13. def loadDataSet():\" H) ~$ s1 N1 l* X6 z: u2 I1 f
  14.     dataMat = []                                                        #创建数据列表
    5 o4 n  s9 v* d& Y  p/ @
  15.     labelMat = []                                                        #创建标签列表
    7 \, z; w3 b& S9 d3 F- ^- x/ ~6 x3 Z
  16.     fr = open('testSet.txt')                                            #打开文件   
    : I  C\" A$ p7 c1 X5 Y
  17.     for line in fr.readlines():                                            #逐行读取1 ~5 `+ J$ \9 r  F- r
  18.         lineArr = line.strip().split()                                    #去回车,放入列表7 G7 u8 X1 x! H: s: f
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    ; w' v! h0 s0 \5 D
  20.         labelMat.append(int(lineArr[2]))                                #添加标签$ {/ C) e\" H0 m8 E
  21.     fr.close()                                                            #关闭文件
    . h5 G& G2 B( r; G
  22.     return dataMat, labelMat                                            #返回9 O0 S( m3 p\" B) k- W
  23. ! C( f0 h8 T. ^  m* _/ |2 }% f
  24. """
    ' y$ e5 f/ P; d/ f9 ~; p! c( k  o. b
  25. 函数说明:绘制数据集8 @) n3 P9 O; J3 q
  26. - B/ v. W3 I. m  R1 G( ]
  27. Parameters:8 j2 [. f, R  [$ `1 p- r\" ?6 X' n
  28.     无
    6 A  Y) G$ Z# V% ~' M8 e
  29. Returns:
    ) i6 L\" x' e1 e3 |3 C4 t5 e
  30.     无  w2 s; S& D2 A4 }! f
  31. """: }) J! C# w# _5 i
  32. def plotDataSet():
    ! p! w/ G9 Z2 n6 H/ Y- d) \
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    # m, u! ?. D  y  W9 Q0 Y2 Q) g4 x1 A
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    6 f& w\" @! M6 d+ b# y  I) D4 i, k
  35.     n = np.shape(dataMat)[0]                                            #数据个数& D3 ?3 d* P- `1 U- ]$ E% R; `
  36.     xcord1 = []; ycord1 = []                                            #正样本\" [0 @: g0 A8 }/ t/ U; D2 Q) |
  37.     xcord2 = []; ycord2 = []                                            #负样本+ w: G! ~  Z8 V( V
  38.     for i in range(n):                                                    #根据数据集标签进行分类+ x  D+ U4 g$ u0 ]! l5 @% E
  39.         if int(labelMat[i]) == 1:) \, e2 q  O9 a; n1 w1 r3 V! E7 M8 Q
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本\" p9 y4 M* e: j! t# b/ G
  41.         else:4 _, W* o6 q) x  B9 y( w\" u
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本1 X! _% y% ~7 K  M9 }5 {
  43.     fig = plt.figure()
    ' t3 a/ N7 {8 E# ?
  44.     ax = fig.add_subplot(111)                                            #添加subplot- o4 f% ?3 L# E+ v
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    ( y- W& H3 g1 P4 Z
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本, F. w2 U/ N- a
  47.     plt.title('DataSet')                                                #绘制title
    \" r8 Y: |$ P1 o2 X
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label3 ?, p) I  M8 K, E- {' Q+ Q& v  ?
  49.     plt.show()                                                            #显示
    0 B: r' l8 N' Q' [* n+ ?: T

  50. ( \& V, q9 |/ \# }2 M0 ]
  51. if __name__ == '__main__':
    # ^; o0 d& W( k. w% [6 g) u+ z
  52.     plotDataSet()
    ( P' X( B+ z. j; K3 @: g! s
复制代码
VeryCapture_20231130171817.jpg
% t7 r7 m. ^  _从上图可以看出数据的分布情况。假设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' T$ S9 b2 @, T
  2.   A' W4 m0 K4 d( L1 t- F' h
  3. """* q* j: o6 N* N5 A3 B3 o
  4. 函数说明:加载数据
    ' M# k9 r  ?% F7 O

  5.   @. t  d: c( n* j
  6. Parameters:. b0 i5 y6 N# C9 R
  7.     无
    * t8 h, o\" Y- T9 m% {
  8. Returns:1 Z$ r2 s2 m4 i% K, G3 }7 N
  9.     dataMat - 数据列表
    & G, R! {6 K$ T( v1 A% J
  10.     labelMat - 标签列表
    % D# T1 s\" K+ m) J, M, a9 M
  11. """5 A% L4 p: ]/ T\" h: Z- L
  12. def loadDataSet():; G; X2 H; w! h. D  T
  13.     dataMat = []                                                        #创建数据列表
    # L: Z* N8 r* R# r/ K
  14.     labelMat = []                                                        #创建标签列表
    0 g) q$ s1 V( B( U7 U! D
  15.     fr = open('testSet.txt')                                            #打开文件   
    # \- {: b8 O' w\" ^! m3 I. K
  16.     for line in fr.readlines():                                            #逐行读取* i& Z) m$ [\" c' z: M- `
  17.         lineArr = line.strip().split()                                    #去回车,放入列表7 x0 P7 i2 v' c+ L\" ]
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据3 H) }' L2 H2 n. q' n! |/ v% R
  19.         labelMat.append(int(lineArr[2]))                                #添加标签, ^( T* G, v' J/ s\" a4 |0 |9 l) z
  20.     fr.close()                                                            #关闭文件
    : P2 J1 S: O  k  q+ q' s$ a
  21.     return dataMat, labelMat                                            #返回% @. I1 g& w  j- n

  22. , _3 A) X& C7 i, W5 C
  23. """
    / l! q3 V: S# A: P7 ~
  24. 函数说明:sigmoid函数
    9 J; D# ?6 }5 n
  25. / J) t% |2 u! D& a, i6 ^
  26. Parameters:- R3 }, c) t9 A% k
  27.     inX - 数据. J$ v2 q+ |$ p% I/ [  M4 s# b
  28. Returns:* k. l, A# `5 I' ]
  29.     sigmoid函数
    8 J) u) F7 I& f& b
  30. """
    7 t# D+ ~0 O  U3 S: h
  31. def sigmoid(inX):1 b7 y: l- J: s. @
  32.     return 1.0 / (1 + np.exp(-inX))5 v; [: W0 U5 R3 h; p

  33.   L& F& h; P6 F8 R8 v5 _
  34. 9 g% L/ W  e( x, M$ T/ w% x
  35. """7 L% a$ |/ ]3 S) l' D
  36. 函数说明:梯度上升算法( i/ p$ W6 S+ {* l

  37. ; x9 {# f5 m- h1 y5 }
  38. Parameters:* O/ |& w$ e\" T9 r
  39.     dataMatIn - 数据集$ d& e- @5 J' l# l0 B) X# @9 y
  40.     classLabels - 数据标签\" F3 B$ B3 M$ F; W) ]' V
  41. Returns:
    ; T! Y; r) K, y1 f5 z: ]( g: B
  42.     weights.getA() - 求得的权重数组(最优参数)
    1 O0 l# @4 c/ j6 J, s' k: f0 w
  43. """( i& I3 J4 _# |4 ~! g% U
  44. def gradAscent(dataMatIn, classLabels):
    $ e/ P# B1 k+ m7 Q* T4 b( m. I
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat+ @' ^( P! s\" z, X3 k\" r$ v
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置\" B. N% Q% A$ `
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    8 e' W* L5 D3 E0 f
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    6 }; z: K; T, R' @
  49.     maxCycles = 500                                                        #最大迭代次数
    ( v( B1 T0 b  }1 p9 G
  50.     weights = np.ones((n,1))' L& ~8 w! r0 f\" A7 a% R6 U7 f
  51.     for k in range(maxCycles):# x4 X# T/ Z+ u0 R: E7 i8 w7 R
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式  |6 p6 b! b, t5 Z$ t) U
  53.         error = labelMat - h
    ' _/ {' N) w3 C\" D
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    4 O7 p; s\" I4 M5 s4 ?3 I& ^, s; E. `
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组+ I6 l9 `8 C! z8 d# a

  56. 4 _7 }- m9 i4 N
  57. if __name__ == '__main__':
    2 e1 z9 \# }5 n0 O
  58.     dataMat, labelMat = loadDataSet()           
    + @- W# [$ Z& G\" ]* t0 p3 t
  59.     print(gradAscent(dataMat, labelMat))
    % B7 q, z$ I9 u* F) p! c# P: y
复制代码
运行结果
  1. [[ 4.12414349]
      P  S, K) V9 Q) q  e
  2. [ 0.48007329]1 Z5 D6 T6 U4 a
  3. [-0.6168482 ]]
    ' _5 z2 N# Q( m% [
复制代码
/ e* t4 g& ?8 @1 r. m7 y9 [
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 17:06 , Processed in 1.429162 second(s), 53 queries .

回顶部