QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1188

主题

4

听众

2931

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    5 I# T! W% ]( C: p- n' y+ n
  2. 函数说明:梯度上升算法测试函数
    6 m# B6 j- S2 s4 K8 U
  3. 2 i# I: l\" i% R
  4. 求函数f(x) = -x^2 + 4x的极大值
      E2 ~  L' _  g; {7 [# F1 s5 j

  5. - [- S! A; u# v  f! W8 X5 K
  6. Parameters:
    * T: L7 V( C8 U+ J6 i  I
  7.     无
    ' u1 j3 o( ^/ r
  8. Returns:
    , x6 v, g, k/ F0 L
  9.     无
    : k7 m8 |( m2 r; M1 R- N
  10. """\" E1 g8 a* i+ y- O
  11. def Gradient_Ascent_test():; J+ Y6 t' b. e- V. U% ^8 P
  12.     def f_prime(x_old):                                    #f(x)的导数
    # H! a0 {1 ^9 H& A7 M& E
  13.         return -2 * x_old + 4+ O3 E4 v  p, s# T: D% v
  14.     x_old = -1                                            #初始值,给一个小于x_new的值6 U. l, C/ ^, I( m\" E
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始1 `) c+ Z% t! V  h4 L7 N
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    6 I; Q7 d, }& T* w8 L7 ]. Z% ~
  17.     presision = 0.00000001                                #精度,也就是更新阈值* h/ h\" a# K1 D. s
  18.     while abs(x_new - x_old) > presision:- t( |7 K6 P- S; b# `4 H. g# b8 f
  19.         x_old = x_new) V4 T: T, b1 u* y
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式* Y% p4 i1 ^( q3 [) f\" O  U
  21.     print(x_new)                                        #打印最终求解的极值近似值* s$ p' j9 U5 c- Y

  22. $ @\" h5 f. k3 f8 K\" H8 b
  23. if __name__ == '__main__':5 Q  w1 I& e( o# Z# k9 z' B7 K3 Y& K; R7 o
  24.     Gradient_Ascent_test()+ {2 g* L0 X0 |\" n1 ~
复制代码
运行实例:
  1. 1.999999515279857
    - \% H) g, d# t) z$ q+ D
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  06 ?3 }  ^8 K2 M& r9 z
  2. -1.395634  4.662541  14 `; m* C) w5 _' M
  3. -0.752157  6.538620  03 L* `- d- Y) Y6 B( r\" G/ j
  4. -1.322371  7.152853  0/ B, H/ ~3 y& m/ r
  5. 0.423363  11.054677  0
    , v: n$ n& V/ [  y1 h+ ]; B
  6. 0.406704  7.067335  1
    / x0 \8 ^! O- c8 l! a5 q
  7. 0.667394  12.741452  0
    ; i& Z9 B0 w! m# j$ L. i# A0 f& L) @
  8. -2.460150  6.866805  1
    5 e- P; @( T6 Z: `
  9. 0.569411  9.548755  0
    2 k\" H* o& C, A
  10. -0.026632  10.427743  0( w\" l% ^: {, H& S0 S
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt- U' }$ o& y1 a8 m/ Y: \4 f
  2. import numpy as np
    \" e; j8 O+ z) n' ~# j- b* F6 x; `6 m
  3.   y8 A; |3 T# Q% O: B* P
  4. """
    \" V, ]+ v$ V. L
  5. 函数说明:加载数据
    0 V8 M' [  Z& b. i$ S& G

  6. ) p, e3 e$ x+ h- a
  7. Parameters:7 m1 X& j5 `1 Y( C9 m$ n* B- L
  8.     无
    \" W! J2 g/ s; L# r9 M1 L
  9. Returns:2 q+ D; P: F0 o0 ?. O9 U: C
  10.     dataMat - 数据列表
      s% T0 \) N! d\" S8 x6 @. y
  11.     labelMat - 标签列表
    $ F: M* E9 T) a: s  z0 _8 _
  12. """
    7 ^- F7 ^1 y* J
  13. def loadDataSet():# a! l6 S0 I9 W& V+ D# j' y
  14.     dataMat = []                                                        #创建数据列表
    1 B* `0 B6 w1 B/ r5 U# O
  15.     labelMat = []                                                        #创建标签列表
    - e' Z. T5 Q3 ~
  16.     fr = open('testSet.txt')                                            #打开文件   2 Z* B9 A; ^! |7 R2 p
  17.     for line in fr.readlines():                                            #逐行读取# ^% D& e% F. s\" i$ G* |
  18.         lineArr = line.strip().split()                                    #去回车,放入列表7 i# n0 t7 D1 c4 I
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据% q% ^. p8 p+ D& o
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    ! _% `! l2 M7 f2 P2 c
  21.     fr.close()                                                            #关闭文件
    $ {' |  C$ K7 z
  22.     return dataMat, labelMat                                            #返回
    ( G! ^' I# P: u# i& P1 Y, i4 W
  23. & e0 G0 t3 C% P) N0 _, X
  24. """
    ! D/ m4 @$ y; z4 f5 q6 \
  25. 函数说明:绘制数据集
    7 R9 J3 E2 s# \  N+ C! ~5 e4 R; n

  26. 0 `9 B  @# h; j! l\" [% H! T
  27. Parameters:
    3 O* V9 \: s- H2 E8 _7 R
  28.     无
    1 ]- D7 _8 R$ H1 ~+ _
  29. Returns:! D/ k% L) }  Q3 Z\" U% i1 i8 ?- B
  30.     无
    2 O4 M: K- Q3 W& M
  31. """; b* m  [9 k& X$ ~! F0 i. p
  32. def plotDataSet():
    \" |( L* N$ a( ?# V  r/ J- G9 S2 Q
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    \" [1 D5 v/ Z8 O* d9 ]/ W& o+ t
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    ) W& g5 M/ q: J$ p
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    8 U2 Z$ ]' [5 B8 K/ r
  36.     xcord1 = []; ycord1 = []                                            #正样本0 ~7 ]6 s, h* w: M3 y; a8 q' F$ q
  37.     xcord2 = []; ycord2 = []                                            #负样本
    2 C0 Y5 u& P; `' o  |
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    . D* f3 `& q$ v- @
  39.         if int(labelMat[i]) == 1:5 C0 U! w% s6 d7 @9 Q7 y2 ]0 ~. r% t
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本& w1 H% j+ c: _1 u6 e0 n1 {
  41.         else:
    * ~1 l$ ]3 y4 E1 s, h
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    % V) r& B3 }% h1 Q) g
  43.     fig = plt.figure(). d; E9 a/ \& _3 l
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    1 C# O) o3 F5 ~6 @\" E
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    ' ]- R7 B9 w6 ]/ U$ t3 j+ W8 E( v
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    , s  Q* @% f7 d
  47.     plt.title('DataSet')                                                #绘制title
    ) m7 Q' t9 h8 J/ J& n3 Q- _1 j7 N
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label0 g0 F% `/ F' z
  49.     plt.show()                                                            #显示\" o- f5 k3 d$ h
  50. + d9 j* ~4 c2 d0 A. w
  51. if __name__ == '__main__':
    0 {: [6 y& V4 U; `2 ~; K  N7 G  n; v
  52.     plotDataSet()
    - A& z2 C+ q9 ^) Z& y$ @
复制代码
VeryCapture_20231130171817.jpg
% A. I4 [( H+ A5 V( O从上图可以看出数据的分布情况。假设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
    # {. t. T& a5 I8 d
  2. + X: [* n3 e+ R: i$ \: f1 E
  3. """4 W0 j6 Q5 @! R7 w! c
  4. 函数说明:加载数据. F' x$ g, ~' l1 B1 P' v' P

  5. 2 W% X( \' B3 @6 c5 [
  6. Parameters:/ ~3 G' P& P: j3 q
  7.     无
    1 R/ v' o, E9 }
  8. Returns:# w# \( T+ h, ?% V( l- g- M) |
  9.     dataMat - 数据列表
    / s: r+ q$ G, Z$ N( O0 W
  10.     labelMat - 标签列表& S# J; r# X1 E8 b- q! Q3 K1 e
  11. """
    / R( c0 o& O$ d. r- g
  12. def loadDataSet():2 m\" M7 a- |  \. G5 p9 ~+ ^
  13.     dataMat = []                                                        #创建数据列表& S- w1 k+ G8 K1 e, n8 P$ r
  14.     labelMat = []                                                        #创建标签列表1 {  f. J! R( B/ m: |' O9 m  b
  15.     fr = open('testSet.txt')                                            #打开文件   ) d8 X( Q. ?! S+ s
  16.     for line in fr.readlines():                                            #逐行读取
    % K4 m$ [+ n/ Y3 P% O( Z
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    5 P' p8 V. n9 T+ x1 G. w1 p0 X
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    8 a6 ~3 W, A, l8 W: h5 g& x% M
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    0 N6 B9 n2 _% N- w' i) f\" @7 [
  20.     fr.close()                                                            #关闭文件
    , k: e4 Q6 `\" n9 l7 v4 G/ s
  21.     return dataMat, labelMat                                            #返回3 u\" M9 i  H& U; H/ {3 u
  22. # v) ]. _/ x; Q! J$ S% `& R
  23. """
    / J$ p( w$ p: x
  24. 函数说明:sigmoid函数
    7 O4 l+ K+ L1 @7 ~3 c

  25. 6 ^# X/ @6 l. D3 G; s/ ?
  26. Parameters:; H3 l3 h/ \7 @- V
  27.     inX - 数据, l0 U. r, ^& r0 {) t
  28. Returns:
    6 F+ b/ R4 Y- Z) ^2 O
  29.     sigmoid函数
    , c% X8 d9 K9 T. a& u' d( F
  30. """
    % U3 e5 g1 u\" `7 ]' ^7 `
  31. def sigmoid(inX):' Q0 i3 Y( o: S
  32.     return 1.0 / (1 + np.exp(-inX)), @$ n* J9 ^# T) o
  33. * ]9 s% J, \' Q6 S) @9 q2 D! a

  34. - N* C; D3 }! w, b* h1 A
  35. """
    ; `. ^6 C! J$ p% C) Z2 t
  36. 函数说明:梯度上升算法/ B, ]: m4 p2 t3 M) N- b- H  Q1 G

  37. + O( [\" `# _$ g0 o3 @* }1 M
  38. Parameters:
    % q\" a4 x) q3 T4 W  O  G
  39.     dataMatIn - 数据集
    % [& D% P/ E! g
  40.     classLabels - 数据标签
    ) T3 i$ P, c: B
  41. Returns:3 ^6 _* g+ f; Z9 _% `+ E
  42.     weights.getA() - 求得的权重数组(最优参数)
    9 B; \0 T3 d4 k, t* ~3 f, ^
  43. """
    ! u# h- ?& a( E& n
  44. def gradAscent(dataMatIn, classLabels):- E+ L8 T) O6 r8 {; X; M& b
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat% n) O0 }1 E9 _' g8 e\" U
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置6 F5 p4 V4 p4 q- q7 ~( Y/ q+ j- q
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。% _3 Y! s$ _0 F
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。2 x/ f+ I& k/ x5 M8 f' x# f
  49.     maxCycles = 500                                                        #最大迭代次数, n; \+ d2 J6 Q  ]
  50.     weights = np.ones((n,1))4 d2 c8 T% j8 j% z' [4 W
  51.     for k in range(maxCycles):
    ! Y. \! e* E1 n( N- c. B# K
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    \" p* A2 p\" C7 W5 c
  53.         error = labelMat - h! e2 t& V7 ~' o( r! |
  54.         weights = weights + alpha * dataMatrix.transpose() * error' e: V  K, O9 a2 Z5 a
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组2 B) Q: p, d8 v$ b+ Z

  56. 8 k8 I0 v( d  V\" h3 F
  57. if __name__ == '__main__':
    7 ]\" o7 x! _* b' F
  58.     dataMat, labelMat = loadDataSet()           
    $ v6 ^$ \# s2 R\" t. x# |
  59.     print(gradAscent(dataMat, labelMat)). p  Q! |! Z; K+ Q
复制代码
运行结果
  1. [[ 4.12414349]
    8 w+ l+ T  v: e% }3 s8 o
  2. [ 0.48007329]
    3 b\" b  D  |! N# @: S. d5 u
  3. [-0.6168482 ]]% d/ H1 f) p  w
复制代码

" F  q3 |/ I" |+ e# H
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-5-26 06:33 , Processed in 0.333009 second(s), 54 queries .

回顶部