QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """\" ^, M: M& m; m
  2. 函数说明:梯度上升算法测试函数
    # b3 q# G\" D: U  j
  3. ! F0 N% f; O! h% ^
  4. 求函数f(x) = -x^2 + 4x的极大值. P& n* d! y% I* _6 s2 `7 ]% H
  5. % E8 u* U' K( s
  6. Parameters:4 S9 R& o+ D# _# H% ~
  7.     无\" q/ _. O! e+ D/ F) k
  8. Returns:
    6 w$ v% r* [9 q  G% S% {, p: h% Q. I
  9.     无
    4 M  z. t3 S% m\" [
  10. """
    7 u# ?' O- @+ C( K. j& e\" J$ A
  11. def Gradient_Ascent_test():\" }4 Z/ c& m1 g/ c* P0 \
  12.     def f_prime(x_old):                                    #f(x)的导数0 B. A) K; L! T( Y! V6 p
  13.         return -2 * x_old + 4* \% W4 f! }! J, r, k. Q
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    ; L9 A$ \, l+ ]  N
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    3 r& R+ M- u2 E% p4 p* e
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度2 N/ Q1 ?. k; M0 a, E' L
  17.     presision = 0.00000001                                #精度,也就是更新阈值4 l, F; e8 m1 b. ]7 u  G: S8 z
  18.     while abs(x_new - x_old) > presision:
    2 s- I7 f1 _8 z0 |
  19.         x_old = x_new
    ( [2 A( [7 w. u8 b
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式# C( N1 e$ R% X3 i
  21.     print(x_new)                                        #打印最终求解的极值近似值
    + F6 E% \5 r& p: q
  22. 4 t$ r6 W. H5 O2 E. G\" @+ q
  23. if __name__ == '__main__':: Y' q. G- q* Z5 c; Y5 w
  24.     Gradient_Ascent_test()
    + j  T$ a5 N1 l, w
复制代码
运行实例:
  1. 1.999999515279857( n! \9 T. E% e5 D) e# \6 }, o; ?
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
    - t\" w  H3 {8 @! }* I6 I
  2. -1.395634  4.662541  1
    4 O+ G2 Z  r! F( l
  3. -0.752157  6.538620  05 H( n% ~; Q) }1 J2 d
  4. -1.322371  7.152853  0( y3 X' \2 V. F\" ]
  5. 0.423363  11.054677  0* K: e: u: Z) G/ y0 H- H7 k; ~
  6. 0.406704  7.067335  1
    % {) u, z& C( H; H1 r2 V0 K
  7. 0.667394  12.741452  0; {* S8 \0 I- f7 I8 p1 p; V
  8. -2.460150  6.866805  1
    / J. e8 S! e) X0 e
  9. 0.569411  9.548755  0: c2 g\" }6 x4 y0 \9 a: C4 n
  10. -0.026632  10.427743  0- i8 K, q- q6 J  x4 l
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt\" J: D+ M5 U3 Y% h6 a9 _
  2. import numpy as np
    \" p$ W$ @& S- t, e' Z
  3. , _+ c/ F5 D0 [1 ]3 [% l, r
  4. """
    ) |( S7 \6 v* s9 D; M+ F% J7 I
  5. 函数说明:加载数据
    ' m$ W* `, M/ ^: O) m( ?6 D0 ?1 m
  6. 4 P6 E0 a) F6 f4 B4 K
  7. Parameters:
    + E/ ?0 n/ c) M$ s% t
  8.     无
    ' L8 M8 e( b) ^  i2 d, }. u
  9. Returns:
    1 Q' A0 h8 ?$ _. s$ x* V7 c
  10.     dataMat - 数据列表! B  M, Z$ Y# W- J9 r
  11.     labelMat - 标签列表
    , H; v4 ^$ }6 q+ ~% V6 N/ I
  12. """5 t$ ~; r' u7 T4 e; @
  13. def loadDataSet():: o& a\" h, h) P6 g+ r
  14.     dataMat = []                                                        #创建数据列表
    # Q- e* i9 }/ Y8 t/ U
  15.     labelMat = []                                                        #创建标签列表\" x8 T# z/ v3 I4 z+ e, l9 y
  16.     fr = open('testSet.txt')                                            #打开文件   
    $ A9 R- O6 q6 j( e) C; ~- }8 {( v' a
  17.     for line in fr.readlines():                                            #逐行读取& Y& h4 \: @- R  i6 m' W
  18.         lineArr = line.strip().split()                                    #去回车,放入列表$ h& i/ m- F0 u! A$ y5 E
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    1 ]# ~6 }) v6 J$ v# [2 [9 ?. \
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    , }8 R7 M5 B. s$ r! H1 q
  21.     fr.close()                                                            #关闭文件9 I2 s3 ^) C+ {& M+ Q
  22.     return dataMat, labelMat                                            #返回
    ; F' K, Z) @' Y4 d: }0 U- _

  23. 3 _# q  R& L, I3 }3 G1 C, z4 M
  24. """
    4 b: m) d: _, u: N) e( E
  25. 函数说明:绘制数据集  t6 ?, Q- S- v+ _3 K

  26. $ E: U+ p! Q. G$ m
  27. Parameters:
    6 N9 `' ~3 q- Y+ @% j
  28.     无
    : l0 D$ a; `( H
  29. Returns:
    - D; c2 ]5 P) u8 p9 Z' t7 t
  30.     无, J( Y9 R* _; V8 N
  31. """
    ' t& Y) d6 q, z. B
  32. def plotDataSet():7 u+ u) s  m8 r7 }9 |
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集& @5 V# B  a6 b4 E\" p\" ]5 U
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    + ]% R: H% n$ p; v4 C\" a
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    , x* [4 o* z) L9 V0 h2 }\" v
  36.     xcord1 = []; ycord1 = []                                            #正样本
    & z, [4 E, O6 L1 H0 c0 S
  37.     xcord2 = []; ycord2 = []                                            #负样本& C\" |/ e; T- R, P0 e  Q- B8 {; i0 _
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    \" S' ~5 z6 X% c( \4 o- x' P! L  Q
  39.         if int(labelMat[i]) == 1:
    6 C, R( \2 c7 ~4 g& W# \\" U
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本* C; g( N7 l7 y: B+ Q& M, C' W' ^
  41.         else:; E, A$ p8 l+ O% d
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    # C! o6 ?/ i' n4 }
  43.     fig = plt.figure()4 `! P9 T5 C' w\" K0 G
  44.     ax = fig.add_subplot(111)                                            #添加subplot% [, t2 }% l7 f
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本5 d& l/ f) D' }/ j2 e) P% y  k
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    3 l7 D. o$ W. r7 \& N7 [9 k
  47.     plt.title('DataSet')                                                #绘制title
    + |  m2 O  D6 K3 g
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label9 n2 t/ z5 @; Y# k; k3 K' @; {
  49.     plt.show()                                                            #显示/ M; @$ P) T9 s$ ]0 }' l1 N1 v

  50. $ D) c* J6 j3 H  D+ B) Q  Y+ \4 u: o
  51. if __name__ == '__main__':5 O* j8 C# X  Y- W: F- `, u
  52.     plotDataSet()' m0 i4 f/ R8 S# g- U
复制代码
VeryCapture_20231130171817.jpg
* L2 ]  ^& \8 C' X/ v+ ?+ Z" 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 np0 C8 m7 f1 ]/ ]' Q
  2. & w  N9 f6 o6 k, l) `\" g) G/ F
  3. """+ a0 h: S% N2 B
  4. 函数说明:加载数据4 |4 F( h9 U: O& D1 a4 B2 o
  5. ) `5 h5 O+ f; a
  6. Parameters:9 I$ K0 A\" q. s\" O
  7.     无
    ; l0 `- v2 \8 o1 Q; f- X. E: |\" T
  8. Returns:5 K& k9 |& ^\" A8 b% J
  9.     dataMat - 数据列表3 p% h: z$ d6 _, |1 V4 `
  10.     labelMat - 标签列表! v( ]* D9 c* [7 S: ?9 b
  11. """
    9 K# M( H8 H6 R, h1 x
  12. def loadDataSet():/ @' u7 x2 k1 U
  13.     dataMat = []                                                        #创建数据列表
    7 I+ d8 M, W8 S2 I5 a- m! ]
  14.     labelMat = []                                                        #创建标签列表* m7 d- i4 G% v8 I5 n4 h
  15.     fr = open('testSet.txt')                                            #打开文件   1 p! y5 B; K9 [8 @6 B
  16.     for line in fr.readlines():                                            #逐行读取# |- o8 M3 Y- ^/ I% A# \* D# C/ @, A
  17.         lineArr = line.strip().split()                                    #去回车,放入列表$ @( h6 x/ o% I/ Q( w5 p
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    ( P. H3 ?( U- V# g. T5 `
  19.         labelMat.append(int(lineArr[2]))                                #添加标签% D, F- M3 u/ @, }/ A\" G
  20.     fr.close()                                                            #关闭文件
    7 w% ~( ^5 U\" C9 P! X! Z7 y
  21.     return dataMat, labelMat                                            #返回
    . K, G# |% i3 `9 f\" I; u

  22. ! L* G( F' G( V. b
  23. """3 E6 U3 }5 T/ o) m0 f& ~. Q. _
  24. 函数说明:sigmoid函数$ s' Q3 W/ S  m

  25. ! w+ ]) {7 P\" {+ d6 ~6 V
  26. Parameters:* w7 F1 j4 Z: ]- Q( ?\" @6 B  `% E) }
  27.     inX - 数据
    ( x' Q; c* g0 M5 \7 W! X/ B* z. C, N
  28. Returns:
    ) w; t+ G; K5 F6 M
  29.     sigmoid函数. r+ ~( ]/ X7 j0 C- g
  30. """
    $ B2 S- n2 _$ a0 t  r* W\" `- S
  31. def sigmoid(inX):
    / H3 h! d\" y* n2 @! N. U; R. W
  32.     return 1.0 / (1 + np.exp(-inX))- N! f1 \; Q) s! l6 ^: U

  33. 7 N! O$ a6 o6 X* \
  34.   G3 s/ o0 Z) U& h
  35. """
      j  D2 y+ J# n* |3 M
  36. 函数说明:梯度上升算法
    , c, q* P% B/ v: d\" d% `) D
  37. 2 S  Z+ {! J  P3 ^/ _+ s
  38. Parameters:6 y% X$ ?) X6 B; G( C+ x( C/ z
  39.     dataMatIn - 数据集
    ! j7 B& g& s1 _+ r
  40.     classLabels - 数据标签7 F: j* p# l, Y
  41. Returns:
    % O0 }( Q) k\" U+ A) _\" S0 q
  42.     weights.getA() - 求得的权重数组(最优参数)- J, W# r, D  j) G* d, t. b
  43. """\" t: f  V+ ~, J* m
  44. def gradAscent(dataMatIn, classLabels):
    ) q& x; y5 v$ Y% z
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    ( G: w8 N5 j8 v( b# o; C8 B; ^
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    . U9 P: n1 d  N1 Q: s. y
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    4 _  Y' j% t) i% g
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。2 {/ p$ t* F$ p% {
  49.     maxCycles = 500                                                        #最大迭代次数
    8 ~  E5 o8 V  E! Y% Y) X5 X9 ~
  50.     weights = np.ones((n,1))
    : ^7 q  D1 M( }% Z
  51.     for k in range(maxCycles):
    6 d2 J$ R( o8 l' T$ ~5 q+ x. `& e/ P% C
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    ! j0 @\" E/ p1 w3 S+ {* y\" i
  53.         error = labelMat - h
    - s7 k8 A( Q  v6 e5 T, B
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    9 z  o* \\" y+ C6 z2 [* \
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组! h4 e: ]! d8 M5 i' b8 e# Y
  56. + Z7 @% x1 M) a& j2 L- L
  57. if __name__ == '__main__':
    5 O* M0 z  s( L3 [
  58.     dataMat, labelMat = loadDataSet()           \" x; E# w: q- I
  59.     print(gradAscent(dataMat, labelMat))4 a: {: Q: H\" Y! l$ j: }$ i
复制代码
运行结果
  1. [[ 4.12414349]! Y6 y! a& ]8 d6 o, z
  2. [ 0.48007329]9 [' f6 e, X& A: S
  3. [-0.6168482 ]]0 W5 q& o, w( r1 M
复制代码
' s5 G! @% U$ ~$ A- I  @7 t
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 02:43 , Processed in 0.453086 second(s), 53 queries .

回顶部