QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """9 P) P$ `; ?' I/ a! \6 }
  2. 函数说明:梯度上升算法测试函数
    ' {7 k4 m3 X1 T& F! g# m* ?

  3. 5 U- M# V( O' ^2 u1 h: ^
  4. 求函数f(x) = -x^2 + 4x的极大值7 Q2 L5 U* x* t) p

  5. % F9 `' F8 y, ?\" m6 p
  6. Parameters:
    ( L; L8 e5 h' w# f' l5 M6 l
  7.     无8 K4 k; f( ^! J! X, v
  8. Returns:
    ; S$ P' W2 k1 T$ S. b+ u  B
  9.     无4 J! \/ h* u) }! d4 k
  10. """! f: U. K( D/ D0 K& w3 R1 Y7 g4 C' z
  11. def Gradient_Ascent_test():
      c- X  \  S7 G9 S
  12.     def f_prime(x_old):                                    #f(x)的导数9 p\" @  r: V+ P7 w! o
  13.         return -2 * x_old + 4
    & s  o$ V8 t3 S3 N. L
  14.     x_old = -1                                            #初始值,给一个小于x_new的值1 |. u/ m+ I! Y
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始& ?; E# l; u/ a  ~
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
      N5 p' p* V6 C- O+ Y& Z
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    / F# L. _! x- J9 t! R; t: g
  18.     while abs(x_new - x_old) > presision:
    9 m- ^- ]) n8 b  b\" J
  19.         x_old = x_new
    / N  ^/ N( P. X9 L( J
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式5 r2 F% F3 g2 ^( Q+ M7 l
  21.     print(x_new)                                        #打印最终求解的极值近似值
    4 p* K$ W& y# @; d# M
  22. ! v$ y* i: n8 g- J& j0 j; |
  23. if __name__ == '__main__':$ T) t/ u* W; J. x% v% c
  24.     Gradient_Ascent_test()
    $ h; z0 n; e# k6 m7 M# j! f
复制代码
运行实例:
  1. 1.9999995152798579 F+ F8 y& x6 N' |
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
    & |3 _& H2 R7 d+ p
  2. -1.395634  4.662541  1; _$ D. d0 ?9 [1 Y
  3. -0.752157  6.538620  0
    - }$ i% w; y8 {: P
  4. -1.322371  7.152853  0: l2 m# L3 ^! V1 y% j/ Q
  5. 0.423363  11.054677  0; x% Y/ I0 s6 J1 R# W8 B1 }, u/ P
  6. 0.406704  7.067335  1
    - O; j\" m' b2 f  R' t; w* P
  7. 0.667394  12.741452  0/ u: e. ]/ k4 k) M, ?! c
  8. -2.460150  6.866805  1
    * Z7 T' v* n% z$ l
  9. 0.569411  9.548755  0
    * u' r' k  [* @( r5 E. D6 W# W) p8 D
  10. -0.026632  10.427743  08 X1 ^  |+ E% c& e# _' m
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt' G1 R, ^- I0 r9 c# }0 Y
  2. import numpy as np: r4 z) X) T6 r$ O- i3 E6 Y3 m, o

  3. 0 a' A( \: G9 S3 H
  4. """/ r3 H4 q8 \$ y/ O9 W9 T: F
  5. 函数说明:加载数据% ~6 G5 o* x, p3 L& ]7 F, F

  6. ' Y  u\" W$ a+ q. U9 J\" ?' i1 C
  7. Parameters:
    4 s5 S- [% |; n& ?) w5 Z
  8.     无
    + ]! }) G: r( K+ W5 K2 `
  9. Returns:
    ) h( V( l  D' V- a8 F# l9 t- R, }
  10.     dataMat - 数据列表3 }  B$ [& L! j& Y
  11.     labelMat - 标签列表
    6 q5 [* l# h. d, x7 \9 n
  12. """3 }9 h) O, o) y! s% q
  13. def loadDataSet():
    ( s4 t/ B3 k2 K4 d1 W# q3 j7 Y
  14.     dataMat = []                                                        #创建数据列表1 P' z4 Z  i* n
  15.     labelMat = []                                                        #创建标签列表
    6 Q5 S$ T+ H2 d& J8 R( L; L
  16.     fr = open('testSet.txt')                                            #打开文件   
    0 s4 S; }. m! T7 p6 u. Z% C
  17.     for line in fr.readlines():                                            #逐行读取
    5 w: g; B0 |) q0 N. o' v  Q
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
    * N1 Y$ M  B1 c2 T! V9 }3 t
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    9 K& i4 z# z* \8 {; @$ a
  20.         labelMat.append(int(lineArr[2]))                                #添加标签' L* w; O# C  a
  21.     fr.close()                                                            #关闭文件( @  @  e1 P* Y4 _, E+ |9 m, ~
  22.     return dataMat, labelMat                                            #返回- x4 q3 G' E5 z7 o  g/ {

  23. ; T! E8 v% k5 F+ Z
  24. """
    . p# r2 x\" }3 u. N\" M/ N. L8 z, n
  25. 函数说明:绘制数据集
    , z$ a* X: `' m* _

  26. 2 q\" c% M\" |- ]% P5 @) N' d
  27. Parameters:. G6 |+ y3 G2 `1 c. E0 }  g  Z
  28.     无
    ( ]. p, N' V\" f5 ~6 E0 z( K
  29. Returns:
    7 `  H5 k; Z! {% l4 l! C1 z
  30.     无
    ) {8 @% ~, l) J5 ?3 D
  31. """
    1 g/ N  ?5 y  G\" C\" T) b# g5 E
  32. def plotDataSet():/ U- ]. d- R4 s  x; @0 V% W# b
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    ; s! m; M/ c2 D) O6 a; P; n
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    8 {2 C' J5 @\" m; r# l
  35.     n = np.shape(dataMat)[0]                                            #数据个数, u# u9 F& v5 i6 V
  36.     xcord1 = []; ycord1 = []                                            #正样本
    / f\" L' _! ]* N\" w, @\" M8 L
  37.     xcord2 = []; ycord2 = []                                            #负样本0 g- A6 ~2 P9 M) p$ n6 u
  38.     for i in range(n):                                                    #根据数据集标签进行分类0 ?( u/ I& G! w6 ]! O2 m
  39.         if int(labelMat[i]) == 1:
    0 K( h) f+ M6 }& e# Z8 W
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本$ C3 D2 i8 D- V% `
  41.         else:+ h! n- D$ w* z( Z
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    , @+ Q8 X1 x3 K  ~7 ?
  43.     fig = plt.figure()\" l+ c8 }# r# `$ O3 a
  44.     ax = fig.add_subplot(111)                                            #添加subplot: I4 m1 [7 u% w0 z\" G! R$ d2 G
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    - Q2 i& _' _+ N: b# h
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本; ]* [4 H3 K2 q% [  E% p9 C
  47.     plt.title('DataSet')                                                #绘制title
    3 H4 l+ J\" \4 I0 C. h$ m7 _% W
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label* f* G* o\" v* s9 \\" C* Q& n: t, ~
  49.     plt.show()                                                            #显示
    - _$ J! A( F2 D  o# N
  50. 3 V) p* i$ g5 P
  51. if __name__ == '__main__':# G1 x0 Y9 a* w- U% i
  52.     plotDataSet()
    # G+ Q5 M/ z% t$ g, U6 P
复制代码
VeryCapture_20231130171817.jpg
9 e6 K: ^' k6 r  W7 H  `从上图可以看出数据的分布情况。假设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; u' _9 }2 J# ]( X/ O) n
  2. $ T7 ?7 M+ g8 J: T2 N: a# J
  3. """
    - O( [. }% G) c( g: E* J9 H
  4. 函数说明:加载数据# o6 z+ j5 u3 C2 {; }
  5. - `+ }- F' f8 z; G$ z2 l/ N
  6. Parameters:4 a' v) W) F# O4 U7 q
  7.     无
    0 j# X\" J, R# h. O
  8. Returns:
    - y$ _: X7 }/ {# I7 o* ]
  9.     dataMat - 数据列表
    + K2 O* `, v9 x. ?8 l
  10.     labelMat - 标签列表
    4 ]4 M$ P7 v' ]+ }
  11. """, g3 p2 Z' g5 m% W
  12. def loadDataSet():
    - J\" A$ d2 M1 Q9 x2 S
  13.     dataMat = []                                                        #创建数据列表+ a. v0 K3 |# Y! b9 H' U$ a+ B
  14.     labelMat = []                                                        #创建标签列表
    : O' R% V, ]+ e9 u
  15.     fr = open('testSet.txt')                                            #打开文件   
    9 d+ ^' o' S7 `& n
  16.     for line in fr.readlines():                                            #逐行读取
    ( K: K* q+ ^  E. y
  17.         lineArr = line.strip().split()                                    #去回车,放入列表8 g+ S\" h( ]6 z( ?& E  M
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据& O) E4 A% s/ r1 X8 m\" K8 K! L. j
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    8 r4 Q& p7 C  V
  20.     fr.close()                                                            #关闭文件
    5 R8 g% I: x0 o2 j5 d1 Z* [
  21.     return dataMat, labelMat                                            #返回. d/ x& e0 }( ^
  22. % x* }3 e  k7 s7 |6 s$ o  C6 @
  23. """
    , @6 ?  H6 P' ?4 E0 C; t
  24. 函数说明:sigmoid函数' Z5 K, j- h! l( v
  25. ( k3 ?$ G9 K6 H/ S4 g3 m
  26. Parameters:
    # H( c: Z. W0 o
  27.     inX - 数据4 V* |0 s6 {/ B. p\" O0 M
  28. Returns:\" D0 z: o; Y  s' w% P) ?- O
  29.     sigmoid函数* ]* [  |( R' B3 L' y
  30. """$ O4 @% z- Q3 e
  31. def sigmoid(inX):& Z! u/ ?% B! z/ t2 s
  32.     return 1.0 / (1 + np.exp(-inX))
    + [7 G4 a3 A  s4 j, h' j
  33. 7 b( I: H/ d5 r* o8 {/ n
  34. 2 m\" `2 D5 E6 q$ V& _
  35. """8 u4 ]$ b- a2 W\" U; P
  36. 函数说明:梯度上升算法; ]7 w4 F' T/ h  ]/ j\" G/ c/ K; R

  37. . @6 o# W4 K) @: `( H
  38. Parameters:
    9 I& J( n\" g2 }1 d+ e
  39.     dataMatIn - 数据集6 n  c2 E5 ~* g3 r6 m
  40.     classLabels - 数据标签\" L' G5 F* ]6 H! \+ D0 ~
  41. Returns:
    # o0 F( U3 M  N
  42.     weights.getA() - 求得的权重数组(最优参数)
    ( }+ U+ }' N: P3 c4 p\" c5 o1 U8 v
  43. """\" t5 e$ C0 h, ^' G6 c0 ^1 l9 C
  44. def gradAscent(dataMatIn, classLabels):: w  L% b/ N, ?' j; ]5 `9 u
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat4 n, h) }- V- A( N1 `
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置( x) |  q' b' \. p& S
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    * C6 [9 c6 F1 V\" i8 m
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。/ [' c2 [\" [3 K9 Y/ {* F
  49.     maxCycles = 500                                                        #最大迭代次数
    8 ]8 s$ _$ n* A. p
  50.     weights = np.ones((n,1))7 \' K1 T0 Q' E# D8 v
  51.     for k in range(maxCycles):
    0 R7 m% ]$ U8 v, A: z2 N3 W- K
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式% ~! w* U' A  b0 F
  53.         error = labelMat - h/ f+ g* ^9 {9 S\" d8 ?
  54.         weights = weights + alpha * dataMatrix.transpose() * error4 ]3 B7 S+ o( V! w4 m0 P$ F* V( |& ?
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组4 |* D\" q' k6 G

  56. - l3 w5 {* }; n3 e7 T! `) P
  57. if __name__ == '__main__':7 H$ k: K\" c0 z2 f+ q$ U# z# |' J) L7 y
  58.     dataMat, labelMat = loadDataSet()           
    / C6 `; _0 l: A8 f2 g. T  e# w% I3 X
  59.     print(gradAscent(dataMat, labelMat))5 ]( g; A, |1 v6 S) Z' G
复制代码
运行结果
  1. [[ 4.12414349]
    - q9 ^! n! @2 Z4 t
  2. [ 0.48007329]1 g2 \0 {: t7 ^' l, t
  3. [-0.6168482 ]]
    , ~2 H4 a* Q; d& O
复制代码

" t! [# V  l$ ]4 ]5 `- `$ B0 D
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-8-26 05:06 , Processed in 0.361792 second(s), 54 queries .

回顶部