QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1176

主题

4

听众

2884

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    9 F/ ]: G- m4 l/ Y
  2. 函数说明:梯度上升算法测试函数
    7 B- A% ]. v* n
  3. ; \7 q! C1 U  |0 e! a3 z: T2 B* ?3 N
  4. 求函数f(x) = -x^2 + 4x的极大值
    # b( s$ g. B  [# `( v- M0 U4 R
  5. 3 G- `5 d; w! s
  6. Parameters:
    , Z- k0 q8 I0 g2 [
  7.     无) V0 O4 R7 D/ |  Q0 ^$ o
  8. Returns:
    0 w7 n! y  Z, Q2 o7 `) ?
  9.     无6 o  M# r  i, z1 Q, `6 e
  10. """
    9 s6 ]0 M2 S* B% a# V- n  y
  11. def Gradient_Ascent_test():& h: i2 I; b5 W
  12.     def f_prime(x_old):                                    #f(x)的导数* Y  h: s0 r  K' Y# c8 |
  13.         return -2 * x_old + 4
    $ L, j- E, D/ {5 k8 y
  14.     x_old = -1                                            #初始值,给一个小于x_new的值4 I9 T! O2 C- z
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    2 X. r- M8 U% d+ a& o4 A6 Q
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度) G! [: D7 ^\" ]$ M% R  V6 y6 P
  17.     presision = 0.00000001                                #精度,也就是更新阈值9 F+ B9 }4 f, K# f( ], y
  18.     while abs(x_new - x_old) > presision:: P: e\" m! y\" E8 n
  19.         x_old = x_new* |\" U9 \- b$ J8 M9 O
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式% g4 m, F\" w# m( }  M
  21.     print(x_new)                                        #打印最终求解的极值近似值( h\" i/ B  k0 L) e9 j

  22. * S  c. I* J2 r$ m8 V\" r' j( L
  23. if __name__ == '__main__':
    ( e8 M* l# h8 p# }) ~% A8 s
  24.     Gradient_Ascent_test()
    . T  c9 U7 B. P: q  a& p1 V$ y7 M
复制代码
运行实例:
  1. 1.999999515279857  Z2 q( Q9 c6 j; o
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0' L9 t# p; n( v4 ~) l2 s
  2. -1.395634  4.662541  1! X) d- q( H: E; q8 d2 k6 u
  3. -0.752157  6.538620  0+ J  n4 s- s( N3 Y  x
  4. -1.322371  7.152853  0
    , a% t7 n3 W4 q& f& i# f: V
  5. 0.423363  11.054677  0) ~1 e1 n3 R6 u3 _7 k
  6. 0.406704  7.067335  1
    , w. C! E4 {' Q/ ~+ l: `6 q
  7. 0.667394  12.741452  0; X6 o- E$ w2 b3 Q0 w( F
  8. -2.460150  6.866805  1
    ! X' d* {$ O9 R9 O) Q& o\" k
  9. 0.569411  9.548755  0
    . u9 w( M  \6 Q  d) ?0 F: O( `
  10. -0.026632  10.427743  08 \: q4 a7 l. n; O7 p
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    2 M& T3 F; _- C% u2 {+ ~6 W; V
  2. import numpy as np* `; H6 \% T6 J, N

  3. # {/ s+ |( T, R/ ]' F. F7 k+ E$ g; L! I
  4. """! ]7 O. |$ \; Q  h
  5. 函数说明:加载数据
    & @, r4 [/ l9 G% I

  6. 3 q2 E' h5 A4 Z) t\" t4 a5 s* R
  7. Parameters:; ~; j1 e+ }6 g
  8.     无
    3 P- v% K+ \! Y3 A7 F2 M/ `
  9. Returns:
    0 a0 N: @& H2 S9 Z7 }9 N4 k
  10.     dataMat - 数据列表
    4 }6 Y+ [7 N( a4 J+ e$ r  Q' N
  11.     labelMat - 标签列表
    1 Q5 J7 l6 I  F/ {! W3 X8 U, N. h& _
  12. """; Z* j5 \6 L, p\" K8 G. V5 Y; B# M
  13. def loadDataSet():
    \" k7 L: ?  Y; v% r0 J
  14.     dataMat = []                                                        #创建数据列表
    & F; V) u* d* [  H\" b# k& S
  15.     labelMat = []                                                        #创建标签列表
    . f7 A+ u/ O9 z8 H( c) H  f
  16.     fr = open('testSet.txt')                                            #打开文件   2 d# m5 h' J% B' j5 \
  17.     for line in fr.readlines():                                            #逐行读取
    % m' K) X' e% ~  B, F5 w
  18.         lineArr = line.strip().split()                                    #去回车,放入列表% j+ b/ @; d4 o3 n: P; v
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    ! K\" h$ t- r% `: W$ D  [* z\" x
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    3 _2 v' x- e2 M$ H% @
  21.     fr.close()                                                            #关闭文件9 W\" p, ~) k5 ~7 \0 v! ^
  22.     return dataMat, labelMat                                            #返回2 ^6 x* a9 H( a: n3 u6 F8 D7 \- X2 ]

  23. 4 Q5 m7 U& Q9 H& g0 T
  24. """4 N9 r. F' L# U( w) L7 {
  25. 函数说明:绘制数据集( I9 W  S. S5 {' }+ Q3 C& i

  26. $ p\" ~# J; x( h: D) S: P
  27. Parameters:, v. u9 L4 O4 D  O  g
  28.     无
    ! \' [( b/ \0 M- Y
  29. Returns:5 _/ [# g8 X6 b% A
  30.     无
    ) S2 e/ T1 E7 H* t; B. V  w8 ~
  31. """
    2 q9 n% m! Y! V) i; N7 P+ z
  32. def plotDataSet():/ G  t\" b% X5 D9 K8 r5 s
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集% `2 D5 A& E8 J4 J7 j  f
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组6 J+ F% B# R. D# ~, P- d: X* Q
  35.     n = np.shape(dataMat)[0]                                            #数据个数- b* }- \; H( _3 e) _+ y) S* N
  36.     xcord1 = []; ycord1 = []                                            #正样本
    , I, G! x% I1 J\" E
  37.     xcord2 = []; ycord2 = []                                            #负样本0 V: E, g5 m2 v7 |! m
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    ( J  q2 E* y$ V( V0 D) Z, m% M* ?
  39.         if int(labelMat[i]) == 1:% c% u2 }6 H* H: o3 Q* L\" g
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    2 \2 Y. |2 t- B\" w: d+ K
  41.         else:' l, x- F( D$ }% f; O6 _; r% i
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    ; M4 u! g' y; c4 \- U& @\" U3 `, r/ Y
  43.     fig = plt.figure()8 _& K0 M, }; q4 R) R0 U
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    * ?1 `: N5 c4 u% R, m  B
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    0 d7 s2 C$ g5 U. o# N
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    5 g0 I: f1 h6 m. O6 {
  47.     plt.title('DataSet')                                                #绘制title2 A; H/ {0 M\" U6 d# j+ H
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    7 ?1 n* P/ v5 p& a; E% K; w
  49.     plt.show()                                                            #显示
    % v0 b$ O$ F- D; l
  50. 9 _! i6 c! P+ @: V( G
  51. if __name__ == '__main__':8 I/ O  I8 z; |! B$ l
  52.     plotDataSet()
    : U. o' A\" G0 E+ L  ^
复制代码
VeryCapture_20231130171817.jpg
$ e% q& A0 _; [, h. P从上图可以看出数据的分布情况。假设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
    ! ^) P% E) a; s8 b# t- _' \; F

  2. ( d' j6 }& t* C& s: _* o; Z/ t0 Y8 t- s
  3. """
    - s3 L, Y$ v! v$ [7 v. p
  4. 函数说明:加载数据- N7 r, m/ W2 T9 @

  5. 7 y# {$ ?) J% N5 k6 l. a3 l7 N
  6. Parameters:& q! ~, O# ^, r8 u
  7.     无
    \" Z# t9 X$ L/ h3 }# K4 N
  8. Returns:
    ; w6 t# K) T0 o# {  o7 {
  9.     dataMat - 数据列表
    + F- Y- L; {2 O% L
  10.     labelMat - 标签列表4 X: \5 ?5 e0 }' _
  11. """  V7 s' u  Q- }
  12. def loadDataSet():3 ]$ s! U$ p\" w, R2 y. v* I) I
  13.     dataMat = []                                                        #创建数据列表$ Z% f! q1 J: X1 Q
  14.     labelMat = []                                                        #创建标签列表0 ]' Q7 N% x0 Z9 B' e
  15.     fr = open('testSet.txt')                                            #打开文件   # b# ^( {  W# }  d& W: o% a3 `9 i) ?
  16.     for line in fr.readlines():                                            #逐行读取6 _( n' e( x: r: y& h. e: j: G
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    \" C. a4 _0 r& I, {6 T
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    6 X6 |: I. \6 M; ^* Q
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    & L7 l. I' m0 z- G$ q
  20.     fr.close()                                                            #关闭文件
    . f: K3 x: ^5 I# n7 M5 _5 I9 ~
  21.     return dataMat, labelMat                                            #返回$ x) Z; v, w7 X( N' w* ^
  22. * p3 _% s5 i\" y, ~
  23. """  ~0 Q2 P0 R3 j# C; R
  24. 函数说明:sigmoid函数3 ~: P$ o! r5 R  [) E8 N
  25. \" C' R5 i+ R& A6 Y, z) {
  26. Parameters:
    \" g: N  \3 w8 |) p
  27.     inX - 数据8 H7 y3 a' z* M7 ?4 Q3 k
  28. Returns:. }. k5 y# A5 E# r5 y' Y0 U
  29.     sigmoid函数
    4 B9 L& n: m- D* }5 a4 n% p
  30. """
    - e1 h1 O: v. F
  31. def sigmoid(inX):) q: R) m* G9 K% B$ Q1 w
  32.     return 1.0 / (1 + np.exp(-inX))0 e  E\" t1 b/ K, _9 ^& d
  33. 0 J: h, O' D3 l
  34. 4 M6 }( \4 m$ O
  35. """5 T* V. Y7 V9 S: o. U/ Q
  36. 函数说明:梯度上升算法; ^4 w* h0 @0 i0 O

  37. ) _* |$ C* e) g6 u! Y
  38. Parameters:' g2 i9 I6 g( `
  39.     dataMatIn - 数据集
    0 c' p0 h) h3 Y, [) s5 U/ s8 k/ p
  40.     classLabels - 数据标签9 T* r; P- L- W# p' _3 r
  41. Returns:( J' U7 E0 M7 p5 V: u$ b: ^; r4 g. m: t$ x
  42.     weights.getA() - 求得的权重数组(最优参数)5 a\" _/ w5 M8 Y% D
  43. """# D# O% n, W8 L) H5 O' i8 e
  44. def gradAscent(dataMatIn, classLabels):
    8 G$ x6 u1 C2 C
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    ! C( x! k' W; R& A1 S
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置: @/ B2 L6 e- b7 I2 t6 p0 S' t& x
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    9 C- [3 o' H5 k, q. t; d
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    * Y) Q: {  M3 T: e8 L( E7 z2 c
  49.     maxCycles = 500                                                        #最大迭代次数
      f& a+ z+ C- {
  50.     weights = np.ones((n,1))0 s% r$ h8 q! u$ \$ n1 K: F
  51.     for k in range(maxCycles):
    8 f* s- ?, V% W
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式* M  K) C* z7 F5 Z3 o  J- j! S
  53.         error = labelMat - h
    : x7 [2 N& L5 y: h
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    2 w* I\" t: q0 y. g
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    % q6 s( l  q) V4 e; Z! L) H2 h+ b\" T
  56. $ W$ J+ Q' h% [; ?, j
  57. if __name__ == '__main__':
    # Y' `0 j& _) @! e* F; W5 m
  58.     dataMat, labelMat = loadDataSet()           
    8 G% J& b9 [% ~2 z$ V( Q# Q  i
  59.     print(gradAscent(dataMat, labelMat))
    . ?8 M- o' T* c  C' B
复制代码
运行结果
  1. [[ 4.12414349]
    7 ^5 J! @8 x$ h1 G5 V6 h\" J$ Q
  2. [ 0.48007329]
    2 r' b: `0 h\" Q: E; b
  3. [-0.6168482 ]]. [  h' ~( }8 Y( C* ]' R
复制代码

. D& W. w6 @! E" l( G4 t3 r
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, 2025-9-17 13:26 , Processed in 0.289083 second(s), 53 queries .

回顶部