QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |正序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    8 }; n; [/ r) a! H; M4 e- q* J0 ?
  2. 函数说明:梯度上升算法测试函数5 s, L0 O2 ^8 S2 U9 c' q; t, o

  3.   }; K- Z8 M, Y7 ~* d
  4. 求函数f(x) = -x^2 + 4x的极大值\" d9 j! F# O5 S0 V, r! r
  5. ; C0 }% w6 s- x: G
  6. Parameters:
    3 D2 M$ u( o+ _$ `( U% V: o( Y; k
  7.     无
    ' @$ G% q1 x  P5 ~& ?\" u
  8. Returns:
    + J4 W6 L( p) v9 m7 H\" Q
  9.     无
    \" m7 l/ E+ ~+ n) L# J2 V) D* {
  10. """3 g; A\" ?4 }1 {8 n
  11. def Gradient_Ascent_test():
    ' I5 H' |0 l; X4 n
  12.     def f_prime(x_old):                                    #f(x)的导数$ z; z2 Q. H& o' V9 G) @
  13.         return -2 * x_old + 47 u& t1 g# J9 ~; X% v0 R9 N8 R% {% p
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    , x' }. c$ E, M* v0 `; F  c
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    / m! o( L  @! }
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度1 w0 }! G5 ]+ r$ N( B0 _
  17.     presision = 0.00000001                                #精度,也就是更新阈值( z' e$ _  m( c
  18.     while abs(x_new - x_old) > presision:6 X5 O6 F# j* b' S# `/ b3 ~8 i. @; |
  19.         x_old = x_new+ V9 ]\" j8 f/ ]  U& r6 m
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式7 D+ y6 f' [2 t5 k7 w% d
  21.     print(x_new)                                        #打印最终求解的极值近似值
    1 o8 F5 d' e1 z  u5 B) z: d& R

  22. 4 s* q0 p% N9 w! w
  23. if __name__ == '__main__':7 E\" v/ G( H3 J0 P\" B
  24.     Gradient_Ascent_test()
    5 {# R' E/ _, c+ v0 D\" B
复制代码
运行实例:
  1. 1.9999995152798571 q# h& ?1 o\" `* m: X7 z' y
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0$ ]' [8 L2 X$ {' J2 O
  2. -1.395634  4.662541  1
    : |/ ?6 ?% Z: e/ b\" N% L( z
  3. -0.752157  6.538620  0
    # x8 Z5 y$ e; c\" [
  4. -1.322371  7.152853  0# Y+ M* y: a( u- Z# t) r5 X3 q, P( l
  5. 0.423363  11.054677  0
    0 r8 p' ?* Y0 Y
  6. 0.406704  7.067335  1
    ' x4 Y4 j- d; E9 Q. l  V
  7. 0.667394  12.741452  0, Q  I2 m5 t$ A1 u: l' w4 a
  8. -2.460150  6.866805  14 c3 C! O( L- d& F\" e5 v: O
  9. 0.569411  9.548755  0
    % ]* Y* D) u1 Q% Y4 T
  10. -0.026632  10.427743  0
    4 z1 Q* X, b1 l\" h  j: x: T\" G% q! U
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt! Y* y$ e$ I% Z# P
  2. import numpy as np
    $ ~* ~+ r* w2 B8 ]  G
  3. : U8 [* W- Y/ c  ^7 \$ I
  4. """
    % ~) G8 Y* ]. Z. T- ^0 g. X
  5. 函数说明:加载数据0 ~3 [1 W0 j* R3 p0 D

  6. 7 }# m# }$ n- w' O( U3 N; }8 Z
  7. Parameters:
    % q+ b  A% |3 n, ^
  8.     无
    + Y# a# n3 g; t
  9. Returns:
    \" y2 Y4 W3 T/ y8 e
  10.     dataMat - 数据列表5 T) q  n4 r3 \+ K  ]. s7 U\" u
  11.     labelMat - 标签列表
    - C7 t9 J. M% x: Q2 P- x) d2 C+ G
  12. """
    ; F% f7 S3 b/ D, Z2 Q
  13. def loadDataSet():  e; D6 A2 K( @0 y* G2 U\" L/ V
  14.     dataMat = []                                                        #创建数据列表5 w0 w0 k\" c. m- {3 ~+ V9 \
  15.     labelMat = []                                                        #创建标签列表+ h% b% W0 N2 K7 I5 Y$ y
  16.     fr = open('testSet.txt')                                            #打开文件   
    * N, j1 R! n/ H4 q
  17.     for line in fr.readlines():                                            #逐行读取$ E1 Q3 R, h+ x& `9 n8 V  G\" o
  18.         lineArr = line.strip().split()                                    #去回车,放入列表5 G: S- T' O2 x# ~
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    * w' B* x7 |3 X5 `4 S+ r
  20.         labelMat.append(int(lineArr[2]))                                #添加标签0 I, v) }- X7 ]/ E4 m1 v\" A
  21.     fr.close()                                                            #关闭文件
    / D, T+ `7 Q\" y( I2 `
  22.     return dataMat, labelMat                                            #返回
    & z6 m( o& I6 ~\" P5 Q4 ~; [/ a

  23. ( h- w/ h8 N2 q/ U' v1 u$ S/ }; Q
  24. """
    1 A5 l4 L  p; n1 l
  25. 函数说明:绘制数据集1 u% L. g. d\" L
  26. % W: m: }% \& e4 H3 p
  27. Parameters:/ d+ n* h* h8 c0 x' |( m8 R+ v4 Q
  28.     无
    0 {# w& p/ V1 T
  29. Returns:
    , H! A( q4 Q2 T( z; h! f
  30.     无2 l8 S9 t/ R. J2 ]1 j. T
  31. """
    ( I) L* H  q, T0 U6 H) `* H& F- A
  32. def plotDataSet():
    1 c3 R, j7 ?5 H) O, D0 v( I8 t  H
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    $ {- O% h\" `5 B$ }+ R' K9 F. a
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    + v: N$ d. {! o8 J\" L
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    $ U1 Y+ U. w+ b4 {' _% a# n- O: G
  36.     xcord1 = []; ycord1 = []                                            #正样本
    5 l: Q6 K\" S& G0 }
  37.     xcord2 = []; ycord2 = []                                            #负样本1 }' P; z1 e: H( \; d
  38.     for i in range(n):                                                    #根据数据集标签进行分类
      g0 h) n0 P3 m* ]% z5 C4 j
  39.         if int(labelMat[i]) == 1:, e. v\" S0 Y* T6 _\" w& [7 J5 R4 u
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    / ?+ D) p# u$ r& E% ^, B
  41.         else:
    ) ?' f- U* ?/ p, \# g) S
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    3 d, M/ @! }4 `- x: H6 Z7 M
  43.     fig = plt.figure()
    ' ^1 U' u) U. ~) K; |' S
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    - x: \6 e3 U$ i( B, e
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本0 X+ l+ a( d- E1 R0 B: }4 A
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    - b% c- h/ V6 k) O
  47.     plt.title('DataSet')                                                #绘制title0 v' A7 h, w. Z9 i$ b6 T
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    6 R* x$ h5 n, z/ h
  49.     plt.show()                                                            #显示
    1 l! C) |- V3 M% d

  50. 4 T: r; P& i8 T6 m0 ^; R5 X
  51. if __name__ == '__main__':
    1 w\" v& J  e  r7 x
  52.     plotDataSet()' d7 u  M* w, E' D
复制代码
VeryCapture_20231130171817.jpg ! }: x( \) X7 Q. 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% ]9 u% H3 U) e# Q9 v
  2. $ K7 N8 Z# K8 O. y, l
  3. """, C2 s! W1 Y4 I. M\" h
  4. 函数说明:加载数据
    & v: v\" O0 |3 x& D

  5. % L1 x' ^# l1 V, G& W0 x
  6. Parameters:0 w/ t\" Q# ?; z% t  j5 M( n/ b) w
  7.     无
    & m8 f5 E  i5 Z4 ?
  8. Returns:% @2 i5 J5 x! `
  9.     dataMat - 数据列表
    6 e9 x# g+ D; s$ T
  10.     labelMat - 标签列表
    8 ], L4 O\" ^9 j6 B5 n\" B1 j
  11. """# i/ T/ z: k% L3 V
  12. def loadDataSet():
    : h$ v4 Y( M( j! c: d+ k
  13.     dataMat = []                                                        #创建数据列表
    \" o# l/ \. {$ o1 f3 [
  14.     labelMat = []                                                        #创建标签列表8 a- M# R6 }4 ~. B! m7 K0 a
  15.     fr = open('testSet.txt')                                            #打开文件   : P( i' P( i& |; ?' v) _* N/ D
  16.     for line in fr.readlines():                                            #逐行读取' p/ ~\" r! S* X1 c6 H
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    0 V, S% Y0 z+ i$ W0 E! X
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    / D9 W) b3 ?\" }1 w7 \% X7 z' n* p
  19.         labelMat.append(int(lineArr[2]))                                #添加标签& h% ~* v\" R: k/ O4 K+ h
  20.     fr.close()                                                            #关闭文件. C1 B6 y. w7 |
  21.     return dataMat, labelMat                                            #返回3 _; [, {+ E8 \9 O\" q% W5 u( ?

  22. - p; I; S! Z$ r$ f/ s' |
  23. """
    \" A5 x5 u2 ]0 i! H& f5 ~: c
  24. 函数说明:sigmoid函数
    $ k  h, |  i0 j, H) R
  25. 1 R6 t\" _. {5 p
  26. Parameters:0 W% ^1 y\" i7 Q+ `( z  D
  27.     inX - 数据
    7 k* R( K1 H7 [0 G$ N( p; @
  28. Returns:
    0 A6 m' p# M' [- ], B
  29.     sigmoid函数
    + u: E0 D! g+ v2 h* h
  30. """
    3 U! i6 S. g# u
  31. def sigmoid(inX):
    ! h! }$ N\" V# l2 ]
  32.     return 1.0 / (1 + np.exp(-inX))
    6 R6 ]4 D. N6 O5 w. f

  33. ( r  [4 Y9 s5 o9 B* ~5 {5 w0 e

  34. ; W; _4 a\" G# }$ h1 u. Q3 d# ^
  35. """$ B1 z$ R# J* e9 e4 k2 f
  36. 函数说明:梯度上升算法/ s$ O\" d( o' j* i, _0 k; o8 s- w7 K
  37. 5 L7 Q  j2 }% m9 T
  38. Parameters:( m4 q8 n1 d$ F9 ?& M  Z  }
  39.     dataMatIn - 数据集
    4 B- K/ R5 x- r' F2 W$ E& q4 g
  40.     classLabels - 数据标签
    / l+ R' x* v( y+ y/ k5 l+ W
  41. Returns:: m* g1 s3 H4 n. I. ^, c
  42.     weights.getA() - 求得的权重数组(最优参数)
    ) o( ]5 r& p5 b1 P# V
  43. """
    ; A% k$ _/ a; C\" d
  44. def gradAscent(dataMatIn, classLabels):: I/ ?9 }2 e  j
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat- L( W+ G/ M8 E2 |8 c
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    . V) N2 `3 A- g4 y
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。% x! T4 h+ n4 ~
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    + S: z, r8 P. t& L$ X5 G8 P
  49.     maxCycles = 500                                                        #最大迭代次数- Q. ^& l6 q3 D4 @: v' ^! b
  50.     weights = np.ones((n,1))  p\" m! C1 J( r  I: J. l7 i
  51.     for k in range(maxCycles):
    7 K, m. ?4 a! F( I& M
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    , z1 Z9 f% a: R( L+ V
  53.         error = labelMat - h
    # n* d$ Q: W4 w6 k1 r, B* V! W
  54.         weights = weights + alpha * dataMatrix.transpose() * error3 z3 B/ k2 Q0 L. _
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    % D) u7 o: J/ b3 o3 w( Z5 W
  56. & d9 e( }; }1 g) L4 z; _% A4 q
  57. if __name__ == '__main__':, l& u8 m0 y, x1 V
  58.     dataMat, labelMat = loadDataSet()           4 d: f; R( u  s* ^( Z8 m; L7 G$ T
  59.     print(gradAscent(dataMat, labelMat))9 A: {3 a. v* a0 H
复制代码
运行结果
  1. [[ 4.12414349]
    - f% `: J0 F) ^$ n! e  I
  2. [ 0.48007329]
    # @1 k; d' b+ Z$ _5 U
  3. [-0.6168482 ]]+ ^- {5 i\" X+ k) v\" a5 ^# b
复制代码
% b4 |1 H- A, m  F: h) w3 T$ m8 Q
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 04:13 , Processed in 0.434403 second(s), 55 queries .

回顶部