QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1176

主题

4

听众

2884

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """; K3 \/ I$ A+ R
  2. 函数说明:梯度上升算法测试函数, J+ E0 L  G$ P

  3. 7 l7 B) N$ o/ T. A
  4. 求函数f(x) = -x^2 + 4x的极大值. S( q0 S  m5 |8 s9 e
  5. 1 P( o7 C7 u4 H& F' G4 d
  6. Parameters:
    $ |: ?\" F1 _  Y  z1 F
  7.     无
    3 V; J( L8 c2 S  m\" Z! w
  8. Returns:- p/ _, e, M: E5 `) x- l
  9.     无  J! ?4 h$ v* k2 |9 z
  10. """\" b; e- r& h! C. }
  11. def Gradient_Ascent_test():
    # j3 g/ `1 A4 d  a
  12.     def f_prime(x_old):                                    #f(x)的导数3 G9 K) |\" V! M! y  Q+ w/ F& A
  13.         return -2 * x_old + 46 J6 L( `$ X) X* H% u
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    # T+ K- ]) u. t' k; d\" B6 S
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    9 t4 @) W* k# l) E
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    \" l5 ~2 M' ?# P$ ^  U* z
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    : L  a& @; a0 r, O1 W
  18.     while abs(x_new - x_old) > presision:9 o, X2 I' F+ v! `& k. N
  19.         x_old = x_new
    * |) D7 Z  l6 N6 D) O7 j3 r# |
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    \" R, n  k- q$ {) V: l\" d
  21.     print(x_new)                                        #打印最终求解的极值近似值6 S4 l8 ~; w( D) z

  22. 3 l0 D( j9 Q% |9 d) v- C- {3 G8 m
  23. if __name__ == '__main__':
    \" n9 t, f( i7 x6 r; N! k# R5 l, B
  24.     Gradient_Ascent_test()) `! [% [3 K: R) K
复制代码
运行实例:
  1. 1.999999515279857* J' B/ Q8 v! y0 G$ ~3 L
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
    ; s3 G\" g\" v# K' L4 \9 e5 b
  2. -1.395634  4.662541  1
    6 ]( |4 l9 v( P3 c0 d$ [
  3. -0.752157  6.538620  0! J  ~! I% p$ J
  4. -1.322371  7.152853  0
    ) I' D4 B: M: s3 p
  5. 0.423363  11.054677  00 p4 f2 E# F1 j$ p$ d5 \- x
  6. 0.406704  7.067335  1
    ' d\" r* Q, d# P2 V: q$ @2 \) ~. K
  7. 0.667394  12.741452  0
    \" ^2 R. ]$ c( y' e- D, J
  8. -2.460150  6.866805  12 U5 N% U$ w0 ^& ]) ]# ^
  9. 0.569411  9.548755  0% d6 V7 {+ g* ~, L2 w5 I
  10. -0.026632  10.427743  0: g2 H3 f, }, u0 g4 G
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
      _* k. E# ~# N1 A0 T# i2 D8 i
  2. import numpy as np
    / J8 G, f& a+ a1 U1 {3 P# L

  3. & B8 W( B0 k9 Y
  4. """
    + z3 Y' o2 V' z! }% w
  5. 函数说明:加载数据  {; I8 o! \' c3 c9 x# d4 w
  6. 9 A9 K4 N# q- s- s/ ?. I
  7. Parameters:2 V! a, @2 Z\" O8 s5 ?
  8.     无& P* U# B- r3 P- \2 q# \; y  x
  9. Returns:* ~4 Z\" b% U, s
  10.     dataMat - 数据列表
    % k9 a6 _& Q0 |) Z, \3 p8 U4 r1 ]) W
  11.     labelMat - 标签列表* e6 A6 L3 p2 o, S0 t1 P3 v: ?/ g7 C
  12. """! q3 y# z' M# k5 h- D/ u
  13. def loadDataSet():
    9 K0 I5 a6 h0 P( r\" F8 d
  14.     dataMat = []                                                        #创建数据列表
    7 i  P/ p: a, L, ?8 x# U; B
  15.     labelMat = []                                                        #创建标签列表; A! E' q) a+ d. k
  16.     fr = open('testSet.txt')                                            #打开文件   8 ]# L5 R8 ~2 ~3 C
  17.     for line in fr.readlines():                                            #逐行读取
    # L$ _5 H5 f0 e\" {; X
  18.         lineArr = line.strip().split()                                    #去回车,放入列表) p- o! n- B' T& \$ y# k% D
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据) X. ~: m1 Z! `$ X2 K- u3 i- g
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    # f' G+ w! P\" W$ p
  21.     fr.close()                                                            #关闭文件
    / T9 t2 W! R\" d\" Z0 `
  22.     return dataMat, labelMat                                            #返回
    \" R% l4 z, V* k4 M  ]+ C
  23. % V/ P4 |2 s+ n8 ~0 {
  24. """5 D3 r4 H' Y1 }( w4 [. ?( |
  25. 函数说明:绘制数据集
    $ e2 |. M; B3 V

  26. - Q# d. [3 c, v
  27. Parameters:/ m+ J$ _' _2 a. U5 l) l9 h
  28.     无
    8 ~3 Y7 O6 a- [) A% f
  29. Returns:
    6 [% f. J, z- u( m# e
  30.     无
    . l% [, ^, J7 ]# B. I; p
  31. """
      U; A; U. l/ @2 q
  32. def plotDataSet():. ]5 E6 _8 O* R
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    7 J\" V5 f. Y: t5 D7 _\" {$ |
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    % f6 f+ K\" C/ N9 e. a. e
  35.     n = np.shape(dataMat)[0]                                            #数据个数- {) c  x7 a& e% x- j, n
  36.     xcord1 = []; ycord1 = []                                            #正样本
    9 @0 \; S3 Z* a8 r2 @
  37.     xcord2 = []; ycord2 = []                                            #负样本
    , k8 C1 ~: K) Z3 i
  38.     for i in range(n):                                                    #根据数据集标签进行分类0 u: V; a1 u5 ^
  39.         if int(labelMat[i]) == 1:
    8 O1 t3 {2 ^5 D% \0 S
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本1 I0 W$ ^1 i1 J# U, _- q
  41.         else:* }4 H% v) Y5 _4 r* j* B) f\" u
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    $ t% x) A! S2 j0 A8 @) V
  43.     fig = plt.figure()1 B: Z' g  s1 Y% {
  44.     ax = fig.add_subplot(111)                                            #添加subplot
      M( ]% M3 E( F# \, ~
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本  i$ V# m# g4 I1 L5 t* e
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    \" ]: P  h2 d6 y, }
  47.     plt.title('DataSet')                                                #绘制title) c, _  @3 z5 U\" l& v3 U
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label$ p+ ?\" c  D2 I
  49.     plt.show()                                                            #显示
    ' `- Q8 F: `\" E3 r8 ]

  50. ' h1 ?. V* M; P& a5 x& Y
  51. if __name__ == '__main__':
    , ?/ a7 Q8 e7 E9 n. v7 r. k! E
  52.     plotDataSet()! ?6 W! R, M( G5 \: d\" V  O# V
复制代码
VeryCapture_20231130171817.jpg : f( k6 y9 P. ?( F$ S* q
从上图可以看出数据的分布情况。假设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
    1 N  S2 s+ K\" b\" I, ?

  2. 8 [$ b7 `: G% A7 u. d
  3. """* z( W, T* G- d5 D  p) \- q
  4. 函数说明:加载数据
    / {% |- O( Q- W7 l; |& r  O

  5. \" p/ O1 |# _, H: ~2 m# P
  6. Parameters:& i6 e3 \1 }9 ]
  7.     无0 S0 C! [9 B3 F2 x+ D# P
  8. Returns:
    , ~% Q( R2 m5 c% F
  9.     dataMat - 数据列表8 b! j  V3 E1 s5 U/ o/ n* d
  10.     labelMat - 标签列表0 [3 U: o: M  t5 n* |) s* A
  11. """
    ( ]7 F+ F6 j! ?3 s
  12. def loadDataSet():$ t- K7 a\" S4 f/ Z
  13.     dataMat = []                                                        #创建数据列表\" |3 v7 `: J( D0 H
  14.     labelMat = []                                                        #创建标签列表8 R9 H) l( I. p/ ~- l
  15.     fr = open('testSet.txt')                                            #打开文件   + T& q+ b$ V/ V# m
  16.     for line in fr.readlines():                                            #逐行读取
    2 H5 R% o\" Y! w, o! F7 Y% W8 V0 f
  17.         lineArr = line.strip().split()                                    #去回车,放入列表! A0 p8 o/ t( T\" A% F- }
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    ; ^, B. V. A4 @\" o0 a7 j4 S7 l
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
      b$ |1 e; n8 `) ?
  20.     fr.close()                                                            #关闭文件
    6 H* Q, P9 p9 {; P7 w7 R0 o
  21.     return dataMat, labelMat                                            #返回
    # |' a) s$ K5 b7 u4 H# e6 R) {

  22. ( m1 u1 h* K& f  n; B; U
  23. """6 }3 b; Q' V* U: x, T6 H  T
  24. 函数说明:sigmoid函数3 U- Z9 u+ p( \7 G% X
  25. \" y$ R' t\" ^+ K- o
  26. Parameters:2 G8 k* n, h. N
  27.     inX - 数据& B  y1 |9 m! R; {$ S+ F% z% m  S
  28. Returns:
    1 w5 d0 O2 P6 v# S6 ^; Y5 ?5 h) t
  29.     sigmoid函数
    ( h- R$ G8 t& Z$ U6 I  {
  30. """
    - R( r; z5 W5 i/ ?# H* j' i; z
  31. def sigmoid(inX):3 J: k- }7 L1 u; t9 |% d
  32.     return 1.0 / (1 + np.exp(-inX))
    8 V; p7 B& s0 ?1 `1 Q) ^8 B  \9 T/ c* U
  33. / O0 n$ O* E: G# u
  34. , |\" \- ^- Y1 w+ t( [* Y\" ]) Q
  35. """; l* T\" q\" |- P7 U( i4 o7 o
  36. 函数说明:梯度上升算法' ~4 a  _8 g5 Q

  37. 7 w' Z  N$ a. _% C+ V
  38. Parameters:- H5 v: y4 w+ i0 H# _
  39.     dataMatIn - 数据集
    3 ]8 @* h8 A& S! w6 k/ c
  40.     classLabels - 数据标签2 Q\" ^. V\" c& {3 C  t7 H0 |6 |
  41. Returns:
    1 F1 u! }, M8 Z: ^/ |& m; |
  42.     weights.getA() - 求得的权重数组(最优参数)
    \" n1 ^- B; {% v9 y
  43. """' U5 `: \- f  Z1 ^4 N; ]( |
  44. def gradAscent(dataMatIn, classLabels):' l: ]) E, u4 f( W; G  u$ T
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    # V  p. ~7 @* v# C, m: Q) E
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置. J5 O+ F\" h7 m  t2 C8 S
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。) \) Y( L4 U5 H. D4 J
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。9 g  d& [9 A) H( Q; e9 F  C
  49.     maxCycles = 500                                                        #最大迭代次数/ G3 k8 `- S$ ?: J# a
  50.     weights = np.ones((n,1))
    5 i& Q( _& e4 A) f0 r
  51.     for k in range(maxCycles):
    4 c- p* Z# _% y3 C8 w3 n
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式' p8 L- R' Q! j/ _
  53.         error = labelMat - h
    # H% S, B5 ~9 A! M  M8 w
  54.         weights = weights + alpha * dataMatrix.transpose() * error5 {- x/ t0 U3 |- m& z& f8 @! O
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    9 @% B0 L  N, G+ K) z\" o7 }* O  x
  56. ( h0 f* S. `1 C. d) j! B
  57. if __name__ == '__main__':2 m0 y& H7 R; t  H. h! P
  58.     dataMat, labelMat = loadDataSet()           
    : l\" ^\" u3 m8 k\" i( n
  59.     print(gradAscent(dataMat, labelMat))
    1 M2 t( T- P+ l$ x! n' u3 P/ Y
复制代码
运行结果
  1. [[ 4.12414349], [7 h# }2 T; u( `9 t
  2. [ 0.48007329]5 t6 I! R; W. A) T4 F
  3. [-0.6168482 ]]
    0 v) E$ [+ f% Z5 v/ p\" S3 C
复制代码
4 G+ p+ Y* y2 X; u4 K5 g
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-9-25 20:39 , Processed in 2.506854 second(s), 53 queries .

回顶部