QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    : R0 r& m/ K9 C+ O! x# {
  2. 函数说明:梯度上升算法测试函数; p( ]& `# E2 ~, r% ^, N
  3. 7 B3 M: m8 t; t
  4. 求函数f(x) = -x^2 + 4x的极大值6 [) j. d) S4 c. }9 J9 i) d
  5. - E+ ]$ u' s: a6 ?0 n2 C' s
  6. Parameters:
    + c- g- |$ X( G+ I, M- u) I
  7.     无
    4 z4 \& a2 }/ L; u0 t\" T1 W
  8. Returns:+ q& A) @9 Z; P, w4 M: j
  9.     无
    1 @) E5 f- ~5 v% v' r' R) k
  10. """
    % \- d) N5 A& K2 W9 l4 _6 G1 `
  11. def Gradient_Ascent_test():
    2 }$ M+ v  v% B) m) O  y
  12.     def f_prime(x_old):                                    #f(x)的导数
    8 r1 ^3 G% F/ q5 a9 m/ K, D# t8 Y
  13.         return -2 * x_old + 4
    ; ^$ N9 B/ W8 y( I
  14.     x_old = -1                                            #初始值,给一个小于x_new的值# @  z3 M! E4 g# Z& c7 z
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    * y7 Y6 x$ R/ y7 @
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度! s& }& i3 N8 K( s6 y6 y+ c# Z5 E1 c, Z' ]
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    0 T$ `9 E8 K\" U% V/ ~
  18.     while abs(x_new - x_old) > presision:6 ?( c( P+ F6 Z6 Q
  19.         x_old = x_new) g1 x2 _\" c* t: ^1 ^\" A
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式8 }% V5 k0 ?! N
  21.     print(x_new)                                        #打印最终求解的极值近似值
    + w* x3 D; {8 G6 B

  22. ) G$ k2 _' Y! g/ }& q
  23. if __name__ == '__main__':
      c4 }# N2 X9 o
  24.     Gradient_Ascent_test()- o* k\" G6 Z8 s, B
复制代码
运行实例:
  1. 1.999999515279857( O0 d. S9 }7 f4 S\" i  C# ^8 s8 z' g
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  04 c$ y* ]- C4 R  E' F! q. e
  2. -1.395634  4.662541  1; z/ \0 V/ h: M7 [
  3. -0.752157  6.538620  0# `6 S: P# E$ A6 W! [
  4. -1.322371  7.152853  0
    5 y0 O0 {; h* J+ ]/ I
  5. 0.423363  11.054677  0
    : M# C& A+ _! B3 g7 o
  6. 0.406704  7.067335  1( P0 ]  }4 m5 v- b) A
  7. 0.667394  12.741452  03 E7 C! H0 N: U  b
  8. -2.460150  6.866805  1
    ( s8 C1 f1 v4 y1 z
  9. 0.569411  9.548755  0/ P$ ^/ w+ Y# {# `+ C6 C
  10. -0.026632  10.427743  0\" R/ ~% h! ~% d7 N; X
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    9 N: z6 R( z' o6 e; t3 Z
  2. import numpy as np
    ' O2 p9 u6 v9 n. A7 r- ~3 A. ]

  3. . Y: V6 v3 V3 b6 N. ]
  4. """( ~+ J' ]( E- h% R+ }
  5. 函数说明:加载数据
      o9 m\" j* _6 o( w0 m$ `( U
  6. : k3 T8 ], ]; y1 `4 R% G
  7. Parameters:
    9 j* [* u) }0 l! _9 N+ [2 M7 a
  8.     无& j/ [' h+ {# x
  9. Returns:
    \" l/ w6 ]8 B+ d( C
  10.     dataMat - 数据列表6 r4 \9 ?5 z8 @\" C4 w6 p
  11.     labelMat - 标签列表
    : z  x3 e/ k& R6 d1 i
  12. """; \5 A8 k8 f5 n9 c8 p
  13. def loadDataSet():
    % L$ Z- X: P1 l: Z  |; R1 A+ r' [8 |& O
  14.     dataMat = []                                                        #创建数据列表* v! Q! G6 b: x4 q/ S
  15.     labelMat = []                                                        #创建标签列表
    $ l* f, T3 e\" ^; x
  16.     fr = open('testSet.txt')                                            #打开文件   ) {1 }' b* O7 c$ k
  17.     for line in fr.readlines():                                            #逐行读取
    8 G- o, S% m7 y
  18.         lineArr = line.strip().split()                                    #去回车,放入列表) n) D5 M# r. @( l% N, Y% h5 g
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    7 Z; n% I( O- V( ?+ D8 l
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    * R( @; R% ?& B( o9 r9 ~% k+ z
  21.     fr.close()                                                            #关闭文件
    8 B- _' ^\" h: a# ^: G0 X0 L* J; k
  22.     return dataMat, labelMat                                            #返回$ `1 k, ]/ T; l* w% m
  23. % p+ P5 A& i0 q+ \1 D* `  b
  24. """
    1 j  k! ^! @. s+ z# o; L
  25. 函数说明:绘制数据集  j% I8 S8 @; i4 L) h
  26. % P; ^9 c% ^% {( W7 I
  27. Parameters:
    3 T: X7 M' D8 I8 F7 s\" i( r
  28.     无  n. A1 M  N$ L* U
  29. Returns:
    4 T2 {1 g9 z! e\" L
  30.     无7 ]9 C1 {& l! G- q6 q: u; ^1 w5 o: H
  31. """
    ; {3 b' e3 j/ {) L) ?5 Q( q# `
  32. def plotDataSet():8 g1 F\" c( A- R9 T
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集5 ]' t6 |8 U4 l: [( g% _
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    9 S. e: }- b' B# F& ~  m. w4 l) G
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    7 z' {* A8 z+ ^\" c\" m8 U8 \
  36.     xcord1 = []; ycord1 = []                                            #正样本9 U3 Y4 `\" d8 e9 p) n' J# o
  37.     xcord2 = []; ycord2 = []                                            #负样本
    1 S# y! _+ K* J2 S4 D. O
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    ! n! a# Y8 y5 J
  39.         if int(labelMat[i]) == 1:7 a' @\" c& _' a0 j( ?
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    ' I( F, M3 g0 j+ f
  41.         else:! R5 B: j4 K! r: h
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    - j) t$ Z. K( P+ W
  43.     fig = plt.figure()/ }& X* X0 X) o: n$ I$ G
  44.     ax = fig.add_subplot(111)                                            #添加subplot3 H$ `- e, E7 }8 G' O/ M
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本0 _) \! I2 P$ _$ D3 d
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    4 S, K2 t5 t: O  _+ M7 [2 A' D4 y
  47.     plt.title('DataSet')                                                #绘制title4 Y+ l\" U1 r! G
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label2 M4 d0 ^1 x3 C
  49.     plt.show()                                                            #显示$ j8 |4 D8 l9 h1 u

  50. ' n+ g2 m6 Q  V* }) Z$ A% G+ Y
  51. if __name__ == '__main__':6 E/ R& z1 ~  G3 t: q& V8 f1 T2 x
  52.     plotDataSet()
    * l4 a# o# m+ v1 X2 @\" M
复制代码
VeryCapture_20231130171817.jpg   m; ^" @1 E, o3 q$ {# ]! 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
    9 u4 h- Y3 [1 F+ q7 C
  2. ( r9 |) T% z4 T' E\" m* W
  3. """$ W! [/ {\" X1 w4 s* [6 g
  4. 函数说明:加载数据
    & N. L3 Y* N! V- D

  5. ! s4 B/ R\" F  ^4 J1 u
  6. Parameters:
    & w4 a! P( b% t# i: p
  7.     无3 Q4 ~9 r0 y/ V% ]$ \1 ~
  8. Returns:
    5 s. ^6 r2 E$ k1 S. l% h
  9.     dataMat - 数据列表! z2 e) w% P& a# B/ @
  10.     labelMat - 标签列表5 V+ \2 f) z% s+ h) x( `
  11. """% T9 P( H& e# O% [  {
  12. def loadDataSet():3 w$ U  [3 D7 R
  13.     dataMat = []                                                        #创建数据列表$ g* c: v' x6 W' e2 [
  14.     labelMat = []                                                        #创建标签列表
    5 _+ `5 w9 b- G
  15.     fr = open('testSet.txt')                                            #打开文件   9 h: Z+ S3 T% J
  16.     for line in fr.readlines():                                            #逐行读取* n: K* U; R3 ]% x6 e5 r\" u
  17.         lineArr = line.strip().split()                                    #去回车,放入列表4 e: k- w% T\" C6 I5 d\" t7 w
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据. K& z$ b# K9 {
  19.         labelMat.append(int(lineArr[2]))                                #添加标签8 \: `0 J6 A  a! g; \% |9 \
  20.     fr.close()                                                            #关闭文件3 S- x, y# v$ m7 _  n) R& F; U
  21.     return dataMat, labelMat                                            #返回
    : h0 H- Q* E1 p- p  U! }/ }\" K* w6 x

  22. ! a0 m/ o& [0 w! Q  ^
  23. """. U5 d5 A* j  p
  24. 函数说明:sigmoid函数- V9 B+ y% W5 I: M  }/ p1 A

  25. ( O# [5 Q- n, `. K$ L% d4 J
  26. Parameters:8 {9 U) m$ R0 Q3 s+ m
  27.     inX - 数据/ f; D2 k; C, d' P1 b$ z
  28. Returns:
    , o# I+ @( }$ Y4 F
  29.     sigmoid函数2 {# |. M3 _2 P3 O$ c$ G
  30. """9 {$ P  c6 b  }. ~6 `7 P0 f1 U
  31. def sigmoid(inX):
    . L4 n9 x( I# c1 W. H
  32.     return 1.0 / (1 + np.exp(-inX))
    5 ^* i  V6 X( `9 b
  33. % ~6 \) I' \/ k* I7 T
  34. 1 R- {/ o* G$ }; f; P7 R+ W
  35. """7 S& A; X( s$ h, x, z9 P3 a
  36. 函数说明:梯度上升算法
    % ]# A. k) k$ S: X5 ~) g

  37. . Q9 G- y- U! K# a7 Q
  38. Parameters:\" `9 q5 o! u+ L) {$ Y* p9 |
  39.     dataMatIn - 数据集\" Z- [8 H& |: H
  40.     classLabels - 数据标签
    / P, l\" G7 c\" m- g8 j' {  V
  41. Returns:
    . w4 P% b: G+ w9 x
  42.     weights.getA() - 求得的权重数组(最优参数)0 V' e# b( Z& E* P\" {& B
  43. """
    : V) h$ S  Q; ~9 P\" R
  44. def gradAscent(dataMatIn, classLabels):
    ; X  J% C( E5 k8 W2 X, |
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat% Z0 L$ G+ D& a0 C: Q
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置$ N% ~9 F# I6 n% q
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。8 d0 A/ A- e& n& q
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    0 g6 N* ]- b3 @: w9 E
  49.     maxCycles = 500                                                        #最大迭代次数\" V' R( C  F7 g0 N
  50.     weights = np.ones((n,1)): D) {- y; m+ e
  51.     for k in range(maxCycles):
    ( b! m! G$ y. T# a
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    3 |6 _/ O8 ]0 A4 K9 b# v' H3 U
  53.         error = labelMat - h
    7 X; J- V5 ^1 _# q\" l8 a
  54.         weights = weights + alpha * dataMatrix.transpose() * error4 g2 j/ i$ s9 @) ~; p# z4 Z\" v' G
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组+ j% R\" r. B, i\" t0 a) [# Y
  56. 7 U3 g- k# p% F2 ~- @
  57. if __name__ == '__main__':  H, Q2 t+ b2 J, ?; i8 w$ _2 k( s6 u
  58.     dataMat, labelMat = loadDataSet()           7 ^: E7 `2 [, W2 S- W
  59.     print(gradAscent(dataMat, labelMat))% A/ l0 Y, U% }6 ^
复制代码
运行结果
  1. [[ 4.12414349]+ [3 Q: K' i+ O  f6 W\" O+ T# N
  2. [ 0.48007329]
    % @: i7 `! n* b\" J; e3 `5 p, m
  3. [-0.6168482 ]]7 j( X# f\" B. U+ D. x: {4 g
复制代码
8 c; C6 L' x  ?& X% W0 c
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-7-11 03:13 , Processed in 0.290886 second(s), 54 queries .

回顶部