QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1171

主题

4

听众

2749

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """$ J) {9 }9 I+ y; |& l
  2. 函数说明:梯度上升算法测试函数
    0 O. _6 c/ G1 c: G
  3. ( F\" U7 |$ v% Q
  4. 求函数f(x) = -x^2 + 4x的极大值
    : |4 e9 r& ?( ]8 z: C! f3 w! q+ j
  5. & L* G- }! J8 P- S
  6. Parameters:  f) K- o& E0 F, L# w' }
  7.     无/ a7 ^; P: u+ u
  8. Returns:8 F/ C& u) u# S, N% x$ V; |* g+ N
  9.     无# v- o# x( [7 h7 e4 H0 A
  10. """
    : `) ]0 t. S, s
  11. def Gradient_Ascent_test():
    5 \# Q8 T, F: h
  12.     def f_prime(x_old):                                    #f(x)的导数; N5 K4 |8 G4 J1 n& w5 d
  13.         return -2 * x_old + 4  K6 E% S1 O0 a
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    ! ?( h+ a6 @3 V* `* Y) Z! Q9 z. ~
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    ; Y/ z8 _5 F5 X3 m\" e
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    7 H4 U9 A9 r: j$ \! [
  17.     presision = 0.00000001                                #精度,也就是更新阈值: B( H7 g7 @/ C$ P$ [
  18.     while abs(x_new - x_old) > presision:
    ! N+ @& M0 k8 i4 w
  19.         x_old = x_new
    . B; y' g4 y# \( k. w+ M
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式8 m7 R4 o3 [  E6 {0 ~5 D4 @
  21.     print(x_new)                                        #打印最终求解的极值近似值( U9 [0 N' d. Q  o' @, E8 o' W

  22. % u( V8 I4 W! y. [) N! {
  23. if __name__ == '__main__':+ |+ j4 M# B( n1 X
  24.     Gradient_Ascent_test()# F9 n2 d/ t+ v: \9 |
复制代码
运行实例:
  1. 1.999999515279857
    ; K\" G0 D+ s1 c- f$ [6 K
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0% p' _: L0 R1 x4 e5 D0 m3 U
  2. -1.395634  4.662541  11 O; n; l! R7 x  [& o0 s
  3. -0.752157  6.538620  0\" [( o8 r1 J8 h% k8 ]. @
  4. -1.322371  7.152853  0% w! ~! w2 L  n! b% j9 f
  5. 0.423363  11.054677  05 t' d- u% F- ]. E
  6. 0.406704  7.067335  1' U, Z) s- y6 ^8 y
  7. 0.667394  12.741452  0
    5 F' t, V) X) J# M
  8. -2.460150  6.866805  16 P# i+ @& L7 r6 o# K% i
  9. 0.569411  9.548755  0
    * v* y5 @/ x% ]
  10. -0.026632  10.427743  0
    ; i; _1 [# \+ R) |
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    0 g% ^. `3 W' l% b
  2. import numpy as np
    6 R* g4 h. c\" q& w; D

  3.   h: {8 [. S) X3 ?( k
  4. """
    - r9 F) ~7 W4 d& O7 {\" o' b
  5. 函数说明:加载数据
    \" z% b# n( v! S0 y: O- v8 c
  6. & b\" [$ h2 I0 ~1 C3 R- R
  7. Parameters:, R0 C! Q, ]9 ~- v& M) i
  8.     无
    4 V: g. Y3 [) T; |, C
  9. Returns:- c. R) s6 Z) Q8 z4 ^; ]5 Z
  10.     dataMat - 数据列表! D& I. Q! b$ c( h% F8 A
  11.     labelMat - 标签列表: H% G% K9 _+ x6 ~4 J) r
  12. """
    ) \; i, E3 ~2 r3 G
  13. def loadDataSet():! c+ V+ S/ }+ S; |6 F
  14.     dataMat = []                                                        #创建数据列表
    4 X5 h8 u4 Z3 X  K3 e5 g* e& W
  15.     labelMat = []                                                        #创建标签列表
    5 G+ f4 T1 U, r, f7 V  Y2 T
  16.     fr = open('testSet.txt')                                            #打开文件   
    + x% f! _# z& R& |; \3 ]: ^& X$ ]. ^
  17.     for line in fr.readlines():                                            #逐行读取+ W. z. S6 r4 Q
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
    0 `+ h\" ^2 o3 F
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据* \/ E4 Z8 w: `; Y
  20.         labelMat.append(int(lineArr[2]))                                #添加标签; a! I0 T. ?$ P7 j7 D8 @
  21.     fr.close()                                                            #关闭文件
    1 b! f9 e) p$ k: k: @  f) d5 u) P
  22.     return dataMat, labelMat                                            #返回
    8 e* |& x0 [3 u, M

  23. 2 z' e3 W; `% J
  24. """
    7 {7 j  |8 V! W9 L3 `
  25. 函数说明:绘制数据集; o% t/ J4 P1 q9 Z$ ~8 i
  26. 5 j/ h6 W. j/ j: E  u* M) D
  27. Parameters:
    $ [2 }- k6 D! Q7 r
  28.     无
    0 M# `; X3 `2 |( E7 Y, T
  29. Returns:8 ^/ c  B: J* ?/ K8 C
  30.     无* Z! X3 L# S\" Z) K\" F
  31. """* W  \  I+ [5 z1 S/ _\" R
  32. def plotDataSet():1 s: S- t; t2 @, A+ e+ n
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    - e( h! I' n! O( ^6 s' P. t$ V) }7 j
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组\" \# n# q2 o  j1 h% J0 }# F0 |( ~3 E
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    : m  o, U3 w4 M8 O
  36.     xcord1 = []; ycord1 = []                                            #正样本
    ) t8 t) E& N, Z3 }% E: X) u
  37.     xcord2 = []; ycord2 = []                                            #负样本
    1 n. g. R* ^$ i
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    1 q+ ]  [: ~/ z8 f3 b
  39.         if int(labelMat[i]) == 1:4 ], W1 n/ t/ n( i- C% W3 g
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本9 v$ z+ f6 i- X) o4 j5 b. V( q
  41.         else:/ J, h& h( x- V6 O* X3 D- U5 C- _
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本, p' k+ g( a\" }
  43.     fig = plt.figure()2 S  m+ h; \1 {& p8 M8 I' ]
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    ) d; t$ }$ j' o\" S
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    2 j# ~6 ^: \7 t1 S' f% S1 S2 Z4 u) U
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    ; L( c  f, ^9 P, e& ~
  47.     plt.title('DataSet')                                                #绘制title
    & ]& B5 S& W4 k  `( x
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    3 j: y- t8 r: W7 ?8 h/ V: D+ C7 {
  49.     plt.show()                                                            #显示: z; O, ~4 ~. S2 U9 L; O6 x9 W2 g

  50. 6 Z; u: f/ {9 g2 }; Y4 b
  51. if __name__ == '__main__':. L2 U9 Q( I5 b6 a; Y( ]5 N& o7 y
  52.     plotDataSet()( {- D/ n$ x4 F; f/ _, f
复制代码
VeryCapture_20231130171817.jpg
, f0 Y! ^: K: q4 ?* U; r从上图可以看出数据的分布情况。假设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
    : V. T- i& F( A& ]7 f9 h

  2. - y& Q) S% h$ E- H
  3. """+ A9 k% r5 A  ^$ T6 L7 v
  4. 函数说明:加载数据. U% K0 x' \* M  q\" Z* W( `) k9 e0 u
  5. 8 o\" n0 Y0 \% N/ A( F5 u
  6. Parameters:
    - F- v8 h% O3 _$ y
  7.     无; [( h: f& l% D0 q
  8. Returns:$ l+ d* }4 V8 ]* H/ u
  9.     dataMat - 数据列表; `! ?- I3 ^+ i) |
  10.     labelMat - 标签列表
    + w6 V7 c4 s) y. F0 t; B
  11. """8 @, r$ e  M\" q/ {. k  {
  12. def loadDataSet():
    # V2 d/ V5 R! Z3 J
  13.     dataMat = []                                                        #创建数据列表- k/ M; V6 x0 N
  14.     labelMat = []                                                        #创建标签列表
    / f9 G/ j2 J2 R
  15.     fr = open('testSet.txt')                                            #打开文件   . X3 j\" s9 b) [) @1 ^# t; C
  16.     for line in fr.readlines():                                            #逐行读取
    * m0 X3 L9 b/ k& ?8 s. V
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    ( m) k  X9 M* \$ @7 c0 \0 B
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据  \6 N9 }5 ?( X4 g\" J% a
  19.         labelMat.append(int(lineArr[2]))                                #添加标签7 R8 B$ l2 A. s
  20.     fr.close()                                                            #关闭文件
    . x9 D- X\" n9 n9 Y
  21.     return dataMat, labelMat                                            #返回
    , c+ L$ e8 X& T- G: ~

  22. ! ~1 `, i; u' z2 v2 v8 j1 @
  23. """. s8 b; B/ O) N+ n
  24. 函数说明:sigmoid函数
    9 d- W# P+ y4 y. ^1 |

  25. , N: `0 ]/ ^1 _- K' ~
  26. Parameters:0 Q1 a- I. A8 e( B
  27.     inX - 数据
    2 R* `* O\" E' u: m
  28. Returns:: w- X4 A1 h9 x  j\" E
  29.     sigmoid函数9 e  [0 D8 T; Y3 k: ]  ~\" g' |
  30. """
    1 C7 ^; l$ ^6 N, d
  31. def sigmoid(inX):7 m/ l& W# ]% w: q3 b: D
  32.     return 1.0 / (1 + np.exp(-inX))
    ( U+ D7 p4 v\" z, Y& d& G
  33. ) ?' }* {8 z6 H7 ]4 f
  34. 4 ~9 l8 `: D. U: n4 u% u& O
  35. """
      }6 u: l\" _- ?& _& h0 P2 J
  36. 函数说明:梯度上升算法
    - s1 S& [4 `* W) H' O% w0 e) _7 g
  37. / k+ c* U3 M& z# h1 d+ }9 X
  38. Parameters:8 S. z1 A* F/ A
  39.     dataMatIn - 数据集8 p9 J! W4 R. {4 u
  40.     classLabels - 数据标签5 m- z& n6 c( y  k1 T
  41. Returns:% F  j9 V- e- L+ P\" v
  42.     weights.getA() - 求得的权重数组(最优参数)/ N, G7 _/ x' p3 S
  43. """4 N, e: f$ i; J$ {
  44. def gradAscent(dataMatIn, classLabels):, x, B0 n5 H& z* V! F  R
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    5 x5 C( a! B* b: O  w# S, K
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置3 t9 @6 M\" w+ P3 b$ B8 l
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    - ]1 |8 H1 v* o/ n
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。& z, i0 z7 K4 L. ~: k4 V
  49.     maxCycles = 500                                                        #最大迭代次数
    6 s! V& q$ C7 l$ u( ]
  50.     weights = np.ones((n,1))
    0 S* J5 V3 R& C/ L, M( s& ]8 J1 J; e- L
  51.     for k in range(maxCycles):
      U5 ~+ V5 h7 `6 u. ^! j
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    4 |5 `- z5 P, B# w( N$ g( S
  53.         error = labelMat - h
    / L/ G5 d9 J  n1 E\" K! u# B
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    7 C& }: k* p1 a* {7 u
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    & e! X) k) s$ d% e

  56. : E2 d: ~' q\" y0 c5 Y# i
  57. if __name__ == '__main__':
    2 w' @' b( U. B) R. k, r: p4 i* Z7 I
  58.     dataMat, labelMat = loadDataSet()           + Y' }; U$ N% O  y$ Q- i
  59.     print(gradAscent(dataMat, labelMat))
    . g2 {( |9 q; {! F: g5 |. m& F+ u
复制代码
运行结果
  1. [[ 4.12414349]
    8 W; ~8 v+ b* i' p' O8 i! V; H
  2. [ 0.48007329]
      c# f* p$ t5 h+ L3 J; y
  3. [-0.6168482 ]]
    7 \6 ~5 A2 a, s) }& b\" u
复制代码

+ W: z0 p, E9 n% i; {
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-5-12 13:14 , Processed in 0.452530 second(s), 53 queries .

回顶部