QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """; p& S& {3 e3 N
  2. 函数说明:梯度上升算法测试函数! g# P& q8 G& `\" P

  3. 9 e- ^2 L7 |\" j, D/ G  l% f
  4. 求函数f(x) = -x^2 + 4x的极大值. {- J7 b' O1 e. O

  5. , W, {8 _2 G, w3 V/ R/ P* T- U5 C
  6. Parameters:, r( c# U# d$ d1 q# X1 J, l' y
  7.     无# X; I7 E; Q. a\" g% J! T# d
  8. Returns:1 u+ \+ \: h( \' Q, L1 |
  9.     无
      M  _% D; X1 B5 |
  10. """5 G- i3 B, ]: v. {! j* |, e2 _
  11. def Gradient_Ascent_test():; P3 K( N4 K6 i$ _
  12.     def f_prime(x_old):                                    #f(x)的导数& B) ~9 u7 W7 r2 z) t' C% [
  13.         return -2 * x_old + 4
    & a- r7 V1 r% \: j# w. S
  14.     x_old = -1                                            #初始值,给一个小于x_new的值, n$ Q+ t8 y0 A# h! Q
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始0 t% E\" f1 d3 h* D( {+ o4 E
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度% ^\" M\" B1 b) D2 M  \7 }6 R# |
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    $ K1 s1 d! j1 }
  18.     while abs(x_new - x_old) > presision:& y0 L6 @0 m. Z! y8 U/ A0 |
  19.         x_old = x_new( h8 a0 k/ r6 X6 z5 H% Y
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    1 B2 ]' ?* x  c; p8 `
  21.     print(x_new)                                        #打印最终求解的极值近似值
    1 ]! k) F; T\" A
  22. # @/ }' R2 a( S1 M
  23. if __name__ == '__main__':% ?+ X( H( C3 {9 p
  24.     Gradient_Ascent_test()# M/ h9 h) ~0 o5 B4 _7 y7 z2 n
复制代码
运行实例:
  1. 1.999999515279857
    1 r  J8 t: A% s. L2 R/ |
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
    % S8 q% x' H& E! Q
  2. -1.395634  4.662541  1# Z, @\" S6 D$ R  h; S8 d# @: K; |) P
  3. -0.752157  6.538620  0
    6 q5 n1 T* g6 m2 t6 F  K
  4. -1.322371  7.152853  0
    : F( N1 r$ H  ?\" ~2 K0 H
  5. 0.423363  11.054677  0
    ; p; |8 \& z, J* c0 K; Z
  6. 0.406704  7.067335  1
    + o/ z  D5 X! O1 ?0 Y
  7. 0.667394  12.741452  04 J3 s9 T9 Q+ j1 F9 n$ m
  8. -2.460150  6.866805  1
    , I- n' s* B$ [+ d7 k* k  i; s
  9. 0.569411  9.548755  0
    9 T5 I, s4 `% A\" P$ z\" j4 W
  10. -0.026632  10.427743  06 y) P4 k2 y: s9 q+ Z3 |
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    & X7 [1 M& R) p4 s
  2. import numpy as np
    9 q' B3 T6 L& I3 E

  3. 0 c; o  x. x/ c
  4. """4 v5 T* \) ~7 b5 i. u+ f
  5. 函数说明:加载数据
    ! R. Y: `\" t1 N, C! K( C9 i- |! e

  6. $ a0 ]9 L5 h9 N; u$ P
  7. Parameters:7 P5 q$ S3 v; J
  8.     无$ r5 f7 y3 i5 w4 `$ A+ M. d
  9. Returns:8 u2 V$ `' J: N& a
  10.     dataMat - 数据列表
    , }/ y2 c* y$ f6 L( J( R
  11.     labelMat - 标签列表
    - r3 N/ D, |6 p% ?' v2 |% h: v
  12. """6 P# h) o! W* ~- ?
  13. def loadDataSet():
    ) g. U! n* [+ Z5 J. M, ?2 k
  14.     dataMat = []                                                        #创建数据列表
    ( Q0 a+ r2 a' [- Z/ ]: E
  15.     labelMat = []                                                        #创建标签列表
    / @6 U  t2 w. K# N8 V
  16.     fr = open('testSet.txt')                                            #打开文件   . a0 o/ j\" _  J
  17.     for line in fr.readlines():                                            #逐行读取
    : o) Y0 i& R7 F1 _
  18.         lineArr = line.strip().split()                                    #去回车,放入列表1 k5 R7 z5 [# u! R1 c# I- u/ M
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    1 U! A6 t' t- d: E
  20.         labelMat.append(int(lineArr[2]))                                #添加标签1 E; v9 L. |: f) b1 Q- Q; ]3 ?
  21.     fr.close()                                                            #关闭文件. M  e: x4 Y/ O$ `! E$ y4 Z5 ]
  22.     return dataMat, labelMat                                            #返回
    # ~- w  u1 A6 Y8 V) U
  23. + {' B4 W. G0 G  n- e+ B. Q& W
  24. """
    4 R& ]; q7 A: J4 i9 F, Z0 ?2 d
  25. 函数说明:绘制数据集
    + R/ O. B1 K8 n0 |: h8 I: G2 c
  26. & C- C* n  B, P0 Y; X/ \2 N, P
  27. Parameters:+ \0 W/ w; F. x) \
  28.     无: W% p$ a4 m; j  k4 V
  29. Returns:
    3 ]% ~) I, y/ a) n0 g
  30.     无
    : A' i  W+ A/ c
  31. """- j  S$ Q+ h; ^! ?8 o* l# Z! k
  32. def plotDataSet():
    % s* X/ D$ I* J4 e& y, T
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    , x1 b* }( Z\" O% L) c; J
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组% {0 W( z& F- x# A\" }* _) x/ e9 g
  35.     n = np.shape(dataMat)[0]                                            #数据个数
      S& J% @* k6 b1 d
  36.     xcord1 = []; ycord1 = []                                            #正样本! O/ }. |, e$ t
  37.     xcord2 = []; ycord2 = []                                            #负样本' o! {# k$ X, ]( v8 [) }* {+ ]
  38.     for i in range(n):                                                    #根据数据集标签进行分类/ V4 g9 n6 r- g
  39.         if int(labelMat[i]) == 1:) |7 ^! X' ?. f: I
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    7 T/ r: j' @8 r: B6 J# \
  41.         else:
    * f5 ^. c0 g! g
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    . Y7 W4 o7 o, `, G/ O$ S% w; `
  43.     fig = plt.figure()$ P- I7 e: v# @: H, p7 p9 k0 \
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    ) f- F- B' L8 l7 A
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    ) E9 `1 ^/ Q- C4 [
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本% C\" Y2 e. Q  F5 V& N
  47.     plt.title('DataSet')                                                #绘制title! H& W0 q  @, d3 Q
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    9 c) B4 z- |* a9 ]
  49.     plt.show()                                                            #显示
    ( A/ c# w& K! ]) I. K- _: o! c2 \
  50. 5 R7 M+ q/ r  p! E8 |  {6 h
  51. if __name__ == '__main__':
    # V5 A0 c4 E( m9 U
  52.     plotDataSet()
    8 ^5 e+ K8 `3 v: J0 \
复制代码
VeryCapture_20231130171817.jpg
) S0 ]6 O4 C4 Z$ i) b从上图可以看出数据的分布情况。假设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) X( ?) R2 e4 B- [
  2. ) v) z  c' D* ?7 v5 w& f
  3. """: v' a+ d! n# B
  4. 函数说明:加载数据
    # g) x; Z: C% T  o5 ~3 [

  5. 3 E3 E( \) X7 _0 j7 \
  6. Parameters:* P\" C6 \4 T) s% b
  7.     无
    . d- a  R' U\" J, g1 T
  8. Returns:$ t1 L' j$ L9 j3 I. K( {5 b
  9.     dataMat - 数据列表  ?& C! j8 d* S/ e7 D$ Q
  10.     labelMat - 标签列表
    3 I# U0 S/ u( U% s, F
  11. """
    0 R) B  |* s) W/ |
  12. def loadDataSet():\" e4 t1 |8 Q8 [/ z- d
  13.     dataMat = []                                                        #创建数据列表
    1 o& y5 \6 j; u5 N
  14.     labelMat = []                                                        #创建标签列表
    5 @' l+ L% G! ]7 J7 ]- g( |/ ^0 P
  15.     fr = open('testSet.txt')                                            #打开文件   
    6 k0 D$ N, I\" P+ }7 C: D6 g\" W
  16.     for line in fr.readlines():                                            #逐行读取/ k) C0 U' d: H\" d5 R0 |& ]
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    6 e! t- Q1 M$ U$ B( T' ?& t/ p
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    , ?) ~5 G! q% d! Y* v+ U
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    / V( [/ c\" o7 {! g0 x* S3 @* a
  20.     fr.close()                                                            #关闭文件( d5 w! J( O1 _
  21.     return dataMat, labelMat                                            #返回
    0 \$ J* K! t* A- V8 }$ ?. m

  22. + M! C- ]. \& u
  23. """! ^, ^& A1 M4 m\" U4 H& k/ ^
  24. 函数说明:sigmoid函数0 p/ x- ~& F9 }\" x& E7 y6 N

  25. \" `+ x+ z, D+ T7 [8 W
  26. Parameters:
    . K2 w9 v/ a4 [4 N9 Y7 ]& ]
  27.     inX - 数据% k3 ^7 b( ]& H4 O$ {
  28. Returns:
    8 J  @* ]! {  e2 \+ A
  29.     sigmoid函数
    , q9 f% y  A. d% X7 ^- X
  30. """+ P' ]8 J( x% g
  31. def sigmoid(inX):: p2 s; x0 [\" y
  32.     return 1.0 / (1 + np.exp(-inX))
    1 U  x4 o\" d- Y# u6 S
  33. + n6 P7 S' ?, _- u& r* A
  34. 8 _6 H9 B& ~: I. [& k\" W+ v
  35. """
    & o/ H; E) O0 O! \& E2 O, Y& U
  36. 函数说明:梯度上升算法
    ( g) B( o0 ?, m- t. {) i
  37. 7 L; I5 H, o& q, I0 r1 u
  38. Parameters:
    + n8 K/ O; ?- X. {9 ^
  39.     dataMatIn - 数据集
    $ |6 T1 t5 `/ ]$ {
  40.     classLabels - 数据标签
      r\" w1 s& x8 y
  41. Returns:6 I/ o! F- r' x/ C- A# V( ~% v8 {
  42.     weights.getA() - 求得的权重数组(最优参数)+ o* l& U1 e( Y0 I
  43. """7 F  q5 o3 C# D# l\" W
  44. def gradAscent(dataMatIn, classLabels):) j( i4 V  b, ~) ^
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    2 c6 d' p, p1 A1 s' ]* p
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置7 K: [! p1 B$ B& h/ ]. |5 x/ _
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    2 i* }7 p2 w0 F% y, V/ w
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。, c; F% O# D, t' i! V
  49.     maxCycles = 500                                                        #最大迭代次数
    4 u\" n, s1 P1 K% w% J0 f/ u/ B
  50.     weights = np.ones((n,1))
    5 K% y0 e6 X+ S4 p4 H. Y& f
  51.     for k in range(maxCycles):2 M1 z( ~7 B% e4 g; Q2 s+ j* i% _
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式7 ]' l8 ^: p  S5 _. s
  53.         error = labelMat - h5 X$ n3 f  o' N
  54.         weights = weights + alpha * dataMatrix.transpose() * error8 a\" z  `$ N7 ?6 l5 t
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组% L6 d8 h! h' M

  56. \" f# e: A\" r0 H
  57. if __name__ == '__main__':5 B. S9 }8 m4 n; x
  58.     dataMat, labelMat = loadDataSet()           
    6 i  D3 G- V% ]% X% D* y* M
  59.     print(gradAscent(dataMat, labelMat))2 L& J6 Q! M2 u7 ]. T
复制代码
运行结果
  1. [[ 4.12414349]
      Z2 O3 ?: Q( b& z
  2. [ 0.48007329]  q, c  P1 _0 X# J5 @
  3. [-0.6168482 ]]1 ^- ^9 c2 C7 b# m$ H# e- F% D
复制代码

2 D; {; z1 h" [5 ?- J
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-25 23:20 , Processed in 0.514689 second(s), 56 queries .

回顶部