QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    2 G/ \- \+ L7 X\" }. u2 }
  2. 函数说明:梯度上升算法测试函数* k; `9 v: U  H: U5 \: M
  3. ' X9 f* N% y. x) u8 n& I' P3 E
  4. 求函数f(x) = -x^2 + 4x的极大值& T0 Z% C' Y, N1 d2 h
  5. # k& p6 ]) v' P8 a: c8 W/ V
  6. Parameters:
    7 t6 _. P* F4 }3 ^) k
  7.     无
    1 o- @6 F8 A$ z: u% ]
  8. Returns:
    , w; Q* M) D5 U\" U1 I
  9.     无
    4 i: y- d; T+ D\" X
  10. """
    ' }2 Y, y4 f: X0 l\" u3 j) f, _: _
  11. def Gradient_Ascent_test():
    . q/ ~9 X9 z1 [9 r0 r
  12.     def f_prime(x_old):                                    #f(x)的导数8 L8 y6 b2 i. p( O$ Z0 X  o
  13.         return -2 * x_old + 46 N0 Y! T0 S2 o7 j
  14.     x_old = -1                                            #初始值,给一个小于x_new的值; s, H! }; j  W5 ]: }5 x! y
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    . O& A. L\" S, r) ?
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    1 d+ p$ j\" m! {' y/ i& q+ V; ]. C: T
  17.     presision = 0.00000001                                #精度,也就是更新阈值
      M9 w0 E9 X1 x* q
  18.     while abs(x_new - x_old) > presision:
    : C9 S- |& |. {7 G7 w0 x+ P
  19.         x_old = x_new
    1 I1 l5 K. Y\" F( n+ D. f  m
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式/ v6 S. |8 F6 }3 ?5 d- @/ p
  21.     print(x_new)                                        #打印最终求解的极值近似值
    ' T2 x3 b. \6 k; b0 I

  22. 4 e' ?# J* U: o% D
  23. if __name__ == '__main__':
    / ~5 A\" M# n7 A* _2 Y  ^: S% J8 r
  24.     Gradient_Ascent_test()7 i# H( C2 b. j, K0 ~
复制代码
运行实例:
  1. 1.999999515279857
    - h( b& F1 s5 U4 f! v; Z+ H, j4 t; n! u
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
      \* [/ t) I5 I
  2. -1.395634  4.662541  1- J8 `( q: i' B- Y8 z
  3. -0.752157  6.538620  05 g' X* ?/ T8 o5 ?1 N# v
  4. -1.322371  7.152853  0
    8 ~. ~  f5 h8 l$ d\" Q! D( s; t
  5. 0.423363  11.054677  0. L( ^/ E( Z8 ^; Q* D' [
  6. 0.406704  7.067335  1
    ; o% D( f6 D  I% M; h
  7. 0.667394  12.741452  04 Q2 }4 j$ W1 m3 [: O
  8. -2.460150  6.866805  1\" [( F8 X; j# w4 A3 i$ }
  9. 0.569411  9.548755  0
    ( D6 a, ~) Y\" p: v/ X5 H
  10. -0.026632  10.427743  08 Z' q9 R# w) q9 g) @
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt4 n2 I. z# D8 K+ }* F
  2. import numpy as np
    \" |\" W/ y. B! _, F+ ^6 v. u/ T* U
  3. : r' z% X0 n1 W
  4. """# i2 E8 G5 S4 U3 |2 ]
  5. 函数说明:加载数据
    # x: j1 e8 n6 a6 T/ ]* A

  6. ) r6 t4 G# n0 P* w8 q# P3 u+ W1 _5 k% Q
  7. Parameters:
    ) q6 J$ z  r2 |2 m% O4 q: D
  8.     无
    % k\" Q% z* T/ @; X$ O/ p
  9. Returns:
    % Q9 n; R7 F\" b  c- B& L  _
  10.     dataMat - 数据列表/ ?, S  b# j2 K! Z
  11.     labelMat - 标签列表0 R& K: p% J! A  g4 O! A: @
  12. """
    ! d/ S3 X- p: r\" l3 L% y
  13. def loadDataSet():6 S& L, S' a7 B8 M6 H\" t( r. ?
  14.     dataMat = []                                                        #创建数据列表
    + l( U; P1 `( u: E* P
  15.     labelMat = []                                                        #创建标签列表
    9 i+ X0 ^( w  m3 {/ `0 M
  16.     fr = open('testSet.txt')                                            #打开文件   % g1 x4 r- k, a3 j3 ^% a
  17.     for line in fr.readlines():                                            #逐行读取2 C! [3 v9 O( V2 G
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
    9 Q; b% @' a7 M! R4 w7 o
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据( f/ e/ |, F$ ~7 t\" f
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    & H* t4 N& s$ y* f9 d! {
  21.     fr.close()                                                            #关闭文件
    1 `- Q* _6 d0 u2 A/ V. L4 ~
  22.     return dataMat, labelMat                                            #返回
    4 D. J; W4 Z5 r: }. l

  23. 1 M$ G. a# y* k; S8 H
  24. """$ l1 \. O( O% F$ P, |0 Q: f  z
  25. 函数说明:绘制数据集* A# D+ o8 X2 F8 [+ N
  26. % p3 H! G' A% X; O$ G& f. ]8 Y
  27. Parameters:
    - j4 h- z7 S/ ]  [
  28.     无. n9 W2 s/ l4 J  |
  29. Returns:. r5 L3 m  E/ o\" j\" u) j
  30.     无  B$ R7 O8 n% I, C1 e- g
  31. """
    ! ?) z6 d: q' M. {5 m
  32. def plotDataSet():\" F( v6 y5 E5 A8 h- d
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集\" j& z) p  C# W1 g
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    - Y; _* {7 [7 q4 Z5 z' r
  35.     n = np.shape(dataMat)[0]                                            #数据个数9 r; q' ^* v0 G
  36.     xcord1 = []; ycord1 = []                                            #正样本
    % W9 d, t/ E1 O3 N  D
  37.     xcord2 = []; ycord2 = []                                            #负样本. C7 `+ V/ D1 }. i1 C' \
  38.     for i in range(n):                                                    #根据数据集标签进行分类/ P( Z  Y; \$ `4 m  n& b
  39.         if int(labelMat[i]) == 1:. x; r, o2 l; |2 {; v9 `
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    $ L4 `1 H/ Z6 g% u
  41.         else:
    : o' U% T! R$ O) [# d) w3 H
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本! }3 f) }7 o/ P6 t4 e) @) R\" F
  43.     fig = plt.figure()
    ) f, J* T$ J& H# _
  44.     ax = fig.add_subplot(111)                                            #添加subplot+ y6 j* U7 _; E9 A* h/ k
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本$ l0 B0 X$ S8 q+ T) Y8 h
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    5 w% g4 X* G\" i2 z, z
  47.     plt.title('DataSet')                                                #绘制title) s# C7 d+ T' F0 m
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    0 [$ ]: b# W2 W$ x
  49.     plt.show()                                                            #显示\" V# y6 H/ W* t/ j
  50. : A2 J3 i6 i3 c- _7 N
  51. if __name__ == '__main__':
    ! _9 n/ S# a4 x( O3 R
  52.     plotDataSet()
    5 N3 `: ~+ S* B7 F9 v
复制代码
VeryCapture_20231130171817.jpg 7 p- _  w+ z2 q& N9 M) a
从上图可以看出数据的分布情况。假设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 np9 j, l1 G/ e$ l0 A- I  }\" l# X, Q
  2. - G( t7 {3 C1 r, S
  3. """0 o% F9 J& ^  N, x5 }6 g, n) i
  4. 函数说明:加载数据
      D! m; [0 J- o3 V5 B

  5.   d. k5 |  Z# @! b8 @
  6. Parameters:4 C. ~' H0 |/ R) @* S5 J
  7.     无
    4 Y0 T6 I( k0 u
  8. Returns:/ R\" r9 e2 H( J  l% B; b( I9 Y6 p
  9.     dataMat - 数据列表
    # U. D- U1 \, E# q' Y& _
  10.     labelMat - 标签列表
    4 D9 S\" R+ F  @+ l9 [# {, W% n% O
  11. """
    & t8 [7 l0 G: [\" ?\" P! n
  12. def loadDataSet():
    # X5 m6 h8 ]8 D2 j; m7 z+ c/ _7 c% x2 S
  13.     dataMat = []                                                        #创建数据列表( F) H: A: @$ e
  14.     labelMat = []                                                        #创建标签列表4 P* X5 n# @/ b. u% ~6 h\" e
  15.     fr = open('testSet.txt')                                            #打开文件   
    ' x& Z9 j) k3 ?$ j# h1 @6 P
  16.     for line in fr.readlines():                                            #逐行读取% e$ |5 ]+ k6 [- M$ o; Y' k
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    7 `2 k# f\" J1 l; E
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    ) ^2 u/ Y* a8 _* ~  i
  19.         labelMat.append(int(lineArr[2]))                                #添加标签7 V# ~0 D4 @5 C9 D
  20.     fr.close()                                                            #关闭文件
    6 E: p4 o3 o3 J. I4 ~* H
  21.     return dataMat, labelMat                                            #返回
    9 d6 a* m' X) n2 G( S, j- m

  22. 7 T4 ^$ S4 p0 q- Q
  23. """
    - t! a! j2 k) \6 k+ `
  24. 函数说明:sigmoid函数\" V& K5 P3 J  v# E# E\" {8 j

  25. 4 t\" {, [. v1 l& p$ X# C$ ?
  26. Parameters:6 S* v: s0 N  W. f
  27.     inX - 数据8 u! P1 J, t/ ?
  28. Returns:) f\" h* R/ l4 E, V/ b: \
  29.     sigmoid函数, e4 j0 F$ h! }: w4 m5 d( t
  30. """
    # c4 B+ ^- ~\" h
  31. def sigmoid(inX):
    : _  i( C1 H\" n9 H- r
  32.     return 1.0 / (1 + np.exp(-inX))
    ) T; `# B7 P- z3 R\" Y5 Y- S
  33. 8 b\" P8 H5 H. C) X
  34. . h- N3 J. g  y& Q\" e
  35. """- `5 O4 W  C% z( n& P
  36. 函数说明:梯度上升算法
    ! |& J% G# m, w7 Y3 `

  37. , e5 J  F# v% ?. b/ M- t4 R
  38. Parameters:+ \\" _! Y- }. I0 W7 K
  39.     dataMatIn - 数据集) C+ Y3 ]0 U/ w$ N( j
  40.     classLabels - 数据标签
    ! k( J! J% O+ h, W
  41. Returns:
    : X- d8 r\" r% D; K
  42.     weights.getA() - 求得的权重数组(最优参数)\" Y3 h) W: Q1 p' I( N  l
  43. """0 N7 r5 F2 r# C: H* M: `
  44. def gradAscent(dataMatIn, classLabels):
      k; R# E* U( j\" ~% \, c# S
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    & s7 X0 b+ W6 t1 W! R5 B
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置5 h. o/ h: I: P8 ]: H1 v. u
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。4 ]9 g+ k9 E\" K
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    . j5 t, P: }& I% Q) ^) t: G) _! J1 B
  49.     maxCycles = 500                                                        #最大迭代次数# ~8 `; X\" S& Z1 G  N
  50.     weights = np.ones((n,1))% `* Q6 I8 \$ u
  51.     for k in range(maxCycles):
    \" F' x0 _0 W5 T$ a+ [% b
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式: L# @' A' k8 n( n( w
  53.         error = labelMat - h; e/ o. [6 r' \- I  ~! F; S8 I; }
  54.         weights = weights + alpha * dataMatrix.transpose() * error2 h0 i2 i& p! ^3 z$ ?! K  N
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    6 Q* z8 [9 G% _  R1 q5 K( o
  56. % Z8 i  A* m8 p; m- i# }( `. d- A
  57. if __name__ == '__main__':- Q8 I( `  ?\" Z+ M# O
  58.     dataMat, labelMat = loadDataSet()           
    6 }% o% a* N9 X4 M\" m* I. n9 h
  59.     print(gradAscent(dataMat, labelMat))$ O* a$ q5 {2 d: z- j
复制代码
运行结果
  1. [[ 4.12414349]9 d. Q5 j+ A1 b0 G
  2. [ 0.48007329]
    / e( n, |$ m. K6 G, d\" G
  3. [-0.6168482 ]]* z; K7 ?% T- X* l& i. R7 b
复制代码
5 ^& k" s! c, ]& L9 G- S
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-10-14 07:04 , Processed in 0.311568 second(s), 54 queries .

回顶部