QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1176

主题

4

听众

2884

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """1 P& t/ l- l) E8 K1 ?! `3 L# g
  2. 函数说明:梯度上升算法测试函数
    $ I% B& m) M( O9 u* E% U& R

  3. 0 p3 F: G0 T; C
  4. 求函数f(x) = -x^2 + 4x的极大值+ J' a7 g$ }. W% }6 r( s( u' j

  5. ! c1 [, f# \% O2 i+ i
  6. Parameters:
    \" W9 J3 _+ Q1 h$ ~7 @
  7.     无: I  s. u* m2 k' L5 E\" `! z\" n
  8. Returns:
    3 u) ]1 \5 y' Y& `2 [9 y
  9.     无
    6 B\" H+ l9 l: e5 O' ?
  10. """- B8 G! V\" W  |4 N
  11. def Gradient_Ascent_test():
    5 K4 @4 C( C9 T+ {# j1 x* Q
  12.     def f_prime(x_old):                                    #f(x)的导数
    6 }; t4 T# p2 B+ ^) S+ D; k5 r5 r
  13.         return -2 * x_old + 4
      A& w( K/ ~8 E$ I* Q
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    + _& x! R) A' Z% `5 ~/ T5 F9 f
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    - m3 m; ?$ P* o9 y8 I. `
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度- Q\" ^% n3 t: t0 X% \
  17.     presision = 0.00000001                                #精度,也就是更新阈值3 B/ l. [0 b: p  S2 h! @
  18.     while abs(x_new - x_old) > presision:
    0 R1 @) A9 P2 Z9 K: ]
  19.         x_old = x_new( h. ]1 n( o# C+ b! Z
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
      C- V( p, |\" F! b2 m
  21.     print(x_new)                                        #打印最终求解的极值近似值
    \" j* u7 B7 z4 m( `9 g4 [5 K0 l7 x

  22. # K: j2 w! _8 e# H% Z
  23. if __name__ == '__main__':! p/ A; o: j3 `4 |% M' L; X% t
  24.     Gradient_Ascent_test()
    , I/ j\" O6 E( b& v! n& J! w
复制代码
运行实例:
  1. 1.9999995152798572 j7 x! r9 [3 H* `- J& d
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0
    \" `6 Y3 k3 H7 K) p- c
  2. -1.395634  4.662541  1
    5 @. n( n$ k& R& t6 w
  3. -0.752157  6.538620  0
    0 d0 R% T; ]. K/ F' W3 `2 d
  4. -1.322371  7.152853  0
    - \; l- `+ a7 E  ~. P9 w+ G1 U
  5. 0.423363  11.054677  0
    \" p- _5 P  X0 U( f* d\" G
  6. 0.406704  7.067335  1
    - A; ~3 |9 z' S0 T5 N. w+ ~
  7. 0.667394  12.741452  0
      f3 s/ h3 C( j. P$ L  z- Z) ?5 ~5 j
  8. -2.460150  6.866805  1
    ! H0 j; t$ o, L
  9. 0.569411  9.548755  0
    5 t/ G* |* E; g8 L\" N# V/ |6 R9 G
  10. -0.026632  10.427743  01 ?  }  _+ D! x
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    , ?) x& ]4 ~  k
  2. import numpy as np
    4 ^/ |& O9 v' X4 I\" i

  3. 5 r6 q# g: o* A/ s2 O+ T
  4. """
    5 f( }- r/ I0 p( ^) _
  5. 函数说明:加载数据
    * P0 `1 c# I* P2 h+ \

  6. 3 ?( M* c1 F$ `\" v
  7. Parameters:
    5 u1 U' v4 j6 K$ x9 ~; b  k
  8.     无
    + e# r, t. Z& J- y( g5 @
  9. Returns:5 G) N3 ?: s\" V# |6 J: u# f
  10.     dataMat - 数据列表
    * z# i7 _: U5 X. \* P
  11.     labelMat - 标签列表
    4 s. @1 e6 I- r
  12. """
    $ W( h. U1 C$ [
  13. def loadDataSet():( k- c) }5 W0 B( g7 |' b( J
  14.     dataMat = []                                                        #创建数据列表  {\" Y$ o+ P# n( {* A
  15.     labelMat = []                                                        #创建标签列表- h' J, U8 V2 n; V# T7 o6 ^  v- q
  16.     fr = open('testSet.txt')                                            #打开文件   
    ) x6 l$ D2 A, P1 v* Q
  17.     for line in fr.readlines():                                            #逐行读取; z\" R: _) {1 i$ M/ }
  18.         lineArr = line.strip().split()                                    #去回车,放入列表- Z* |\" T* g5 D/ u# {0 [
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    $ L, E9 R# |* @# _, O
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    # q, d3 K2 l! C, ^! K
  21.     fr.close()                                                            #关闭文件
      T4 Z! p1 i5 r7 F& ?+ ?5 ~+ R
  22.     return dataMat, labelMat                                            #返回
    2 W+ x; l6 l7 Y& F) C1 G% m8 r# I
  23. 3 C) E/ T* a/ R1 [( ^- T
  24. """
    - l( C0 X( Y3 q4 [# H
  25. 函数说明:绘制数据集
    + w3 C# v' ^# w9 N8 v
  26. 3 ^8 B7 d3 z5 p4 H% J5 Y5 c
  27. Parameters:
    $ Y1 q. w; }: a8 l, ]+ m
  28.     无
    * v) N; `3 f/ z& F8 b: M: X
  29. Returns:( w7 k2 D  M) a! I, N# I9 g
  30.     无
    ' U$ J9 L2 U* [: r; x
  31. """  X+ e2 F+ a$ [; u\" b
  32. def plotDataSet():
    / U. Q. w4 Y: b  g* S6 f
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    / b* ^+ }8 p! x9 }. M1 x; p0 |$ V: j
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组; n, F& E' W\" O
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    7 ?; k2 {. y% t' L/ a
  36.     xcord1 = []; ycord1 = []                                            #正样本
    ( d4 k0 U\" l* r2 E; `- i. U# P
  37.     xcord2 = []; ycord2 = []                                            #负样本% a3 F/ o# \$ L
  38.     for i in range(n):                                                    #根据数据集标签进行分类\" @4 K0 w9 R+ T8 S
  39.         if int(labelMat[i]) == 1:
    ! |! W- J4 b3 Z; ?9 v3 H9 q
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    : X: {+ x8 W' s3 r! ~: t$ c. c7 O
  41.         else:
    + E# x: W7 ]3 B
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    + o; S+ q9 m( C, \
  43.     fig = plt.figure()
    ! C7 c$ I\" d# i. {9 z, ~2 N3 ~, d
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    \" A# g! H' _- C- \; c0 G5 X6 M
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    - C+ K; A# G$ ^  z$ @, i6 b
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    , @! Y8 ~8 c+ z
  47.     plt.title('DataSet')                                                #绘制title
    8 o: p7 x; {9 g7 |6 W: J
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    . ]2 U5 v  [6 ^
  49.     plt.show()                                                            #显示, A* I, R( n1 [- V
  50. $ W! m4 S& `# o4 L\" Q2 K6 D
  51. if __name__ == '__main__':( A& {/ f- b# r; R
  52.     plotDataSet()
    / J5 H  H0 n$ Z0 U
复制代码
VeryCapture_20231130171817.jpg
* T5 D/ `* G/ c5 s0 `从上图可以看出数据的分布情况。假设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) e7 j3 ^1 k: o0 ~
  2. 2 F% y: o, n3 W# [$ Y+ [
  3. """2 ~) K2 c' T2 d6 P3 c+ _+ u
  4. 函数说明:加载数据
    ( r# h\" {1 }1 W$ i# y# V! {7 b
  5. / u3 ?6 w, F2 W  X' j2 O9 o
  6. Parameters:! b( B: |+ ]1 G) \( f
  7.     无+ F) q0 [9 z. \
  8. Returns:
    0 }; M8 l& L) A+ }; }$ y
  9.     dataMat - 数据列表
      Y3 o& {+ A7 i4 w1 l. d
  10.     labelMat - 标签列表& T3 [\" [4 K* I
  11. """
    / k  o8 U0 U6 T' N8 k
  12. def loadDataSet():
    \" `: I! S; B$ W& k& B
  13.     dataMat = []                                                        #创建数据列表3 S* i* A$ @+ ]( W/ g\" I
  14.     labelMat = []                                                        #创建标签列表  }) X) }/ a& S) b
  15.     fr = open('testSet.txt')                                            #打开文件   
    8 U4 a0 O6 I  o7 j0 j4 }: V5 Z0 v; F% t
  16.     for line in fr.readlines():                                            #逐行读取
    6 r& X( P8 H+ K3 B4 F% k/ C
  17.         lineArr = line.strip().split()                                    #去回车,放入列表+ z' Z+ ?/ t; w9 @7 J4 c
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据1 w+ R* p- j7 v& G9 c9 o
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    1 D! G2 Y; X7 u( s2 G3 S* Z& E
  20.     fr.close()                                                            #关闭文件$ V( R/ ]0 F/ Z) Q  ~& z( J; y$ ~+ X
  21.     return dataMat, labelMat                                            #返回4 A1 j8 _; ?; D\" W8 k/ |

  22. . F; r, b9 V) |2 h; E: E9 P\" e
  23. """! \- ]- B& _) \% z) c% [
  24. 函数说明:sigmoid函数7 k! P( O' v: c: R

  25. 7 L5 c' ~) G. P/ Z# b+ Z; f; |2 x
  26. Parameters:
    ! q3 a# [# ^, z6 }
  27.     inX - 数据4 X- C$ Y7 |6 W9 g1 ~/ t
  28. Returns:
    1 _7 N4 q& L2 ~4 w% Q/ F
  29.     sigmoid函数8 k, ^9 Z3 E; s* C
  30. """
    % v0 f: H4 Q( |9 A! g- S  L3 h4 {
  31. def sigmoid(inX):
    ! D# S: `2 `% A! B8 ?) M6 C  _
  32.     return 1.0 / (1 + np.exp(-inX))3 ]' v( B7 A5 U, E- r+ L* @

  33. \" s% F, T4 A) E4 f4 `& j9 Z& j9 n
  34. # B/ o! @0 h4 a  A
  35. """! T, f1 {9 f+ J) R7 D* i  ^$ A: O
  36. 函数说明:梯度上升算法
    0 v$ Y5 |# m) y1 n- _8 _
  37. 6 q, m* L6 [\" Q9 V\" U4 h! \
  38. Parameters:
    * }$ y# k0 u+ M
  39.     dataMatIn - 数据集
    $ y$ |: m) S) H, s8 H' T
  40.     classLabels - 数据标签
    ; @# R# H\" t7 k! L& L  _
  41. Returns:0 z6 W0 o5 r1 J- l, j: C) R1 }
  42.     weights.getA() - 求得的权重数组(最优参数)+ O* |3 I8 p* o% c9 M. l
  43. """3 {2 Z7 ?1 Q' i4 b
  44. def gradAscent(dataMatIn, classLabels):8 M8 A! l$ F\" Y\" I; ^1 ], D
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    \" T. C) h) E0 ?- \* ?+ A
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    % U# T: J$ p\" d7 l
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    7 |* a7 S, L- E8 @4 I- f8 f
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    / I5 r+ }& }' K% P: s
  49.     maxCycles = 500                                                        #最大迭代次数
    ' Y4 Z1 F& V3 T6 b
  50.     weights = np.ones((n,1))6 R# E( C0 d5 ?& z. K  W/ V4 h# S
  51.     for k in range(maxCycles):* K, [# e6 R5 c; F' X, d- L
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    $ D/ d3 R( Y  |2 \
  53.         error = labelMat - h
    6 {\" |: I, b) |! S, N! K, i  G+ V\" P
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    * s7 b9 u. T+ y; N  f1 D/ R
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    # J8 x- Q2 l& v0 \6 L

  56. - X5 D' `& V9 J& n2 z$ D( `% Z, ^
  57. if __name__ == '__main__':# ]0 ?. r' r$ I& H. P
  58.     dataMat, labelMat = loadDataSet()           & b4 Y+ I2 D. ?7 ~
  59.     print(gradAscent(dataMat, labelMat))
    % B( {+ ?! k5 Y+ L9 m
复制代码
运行结果
  1. [[ 4.12414349]$ _* n! x7 m- w/ B# L
  2. [ 0.48007329], a\" g, Z& P: x& G5 ~8 P0 D' G
  3. [-0.6168482 ]]
    4 |1 p% e& z: e' k\" R
复制代码

% C% x. l8 N, R) e8 j- b
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-23 14:50 , Processed in 0.479416 second(s), 53 queries .

回顶部