QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    ! ]9 T% ?' b( S7 r# _: T\" }
  2. 函数说明:梯度上升算法测试函数
    * @5 T5 }7 R+ K! r3 D

  3. : ]# V9 G7 _  G, Q( d0 ^
  4. 求函数f(x) = -x^2 + 4x的极大值\" i\" Q# y- z3 y4 ^/ |* t$ y3 p
  5. ) ?; {6 F) O5 |4 H: Z' M* T  g
  6. Parameters:' s7 d8 o9 d* X( V( Q
  7.     无
    1 D\" j# ?0 a$ |5 R1 G& m
  8. Returns:) S4 x: X# |: V( @
  9.     无, F' n* _* R' M% E5 k, K6 y
  10. """
    - Q' k3 X! P5 [. X! e4 m- k
  11. def Gradient_Ascent_test():, a8 j\" \$ Y0 c, k$ g4 ]- B5 ^
  12.     def f_prime(x_old):                                    #f(x)的导数5 n' ~3 S+ u* v& z9 t! G+ ~
  13.         return -2 * x_old + 4: p- a( Y. @! p& m5 }5 W6 ?
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    0 `2 M7 x; f- P\" Z: F
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    : S3 z\" f\" `6 B6 v/ O
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    8 u/ F. H2 R! m
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    6 h- t+ H4 A\" x
  18.     while abs(x_new - x_old) > presision:
    / ]! n0 M/ P8 o- e; w\" |
  19.         x_old = x_new
    $ U' d5 D; [6 M$ I( O
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式2 _8 p+ c! L8 _  S, T. \7 y- _& b2 p% U
  21.     print(x_new)                                        #打印最终求解的极值近似值
    0 ^\" i! Y$ E\" D+ X$ C0 U* P' e; c

  22. , T% Z1 N! R! ?4 V2 L, ~4 a
  23. if __name__ == '__main__':
    2 F# h2 ^& J$ @9 L$ c* j4 q* o
  24.     Gradient_Ascent_test()
    $ [7 I! y* O5 r9 X( n* [1 A+ U1 |
复制代码
运行实例:
  1. 1.999999515279857
    ( a  _9 C& h2 K) r) [
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  00 ]7 C  e! e7 A* Q& B$ i( P\" R' `
  2. -1.395634  4.662541  15 p1 y4 h4 J: n' K- Q0 I\" r
  3. -0.752157  6.538620  0
    ) E) T1 Q  {$ B1 o: P: S
  4. -1.322371  7.152853  0: q  t$ A5 ~  Q8 Z2 O
  5. 0.423363  11.054677  0
    \" C4 ^8 c  G8 R1 ]) A
  6. 0.406704  7.067335  1
    ) q+ N3 p' x3 b\" {
  7. 0.667394  12.741452  0$ t# O: U. |0 |, s1 X: _; o
  8. -2.460150  6.866805  1
    6 U* `: e$ I4 Y$ ?
  9. 0.569411  9.548755  0. W* L& T7 r* O
  10. -0.026632  10.427743  06 g) u5 z8 J7 P2 M( M$ B- U  \
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    % I* E# S, A7 V8 V
  2. import numpy as np$ \) A5 \6 v: z& n) g: B+ h

  3. ; F\" b  u% A: l: f5 r! H. R
  4. """
    8 C$ a, p* h5 ~
  5. 函数说明:加载数据
    ' t+ Y6 ^2 y\" w* X& n# E! p\" X
  6. ' Y  ?! i\" S2 X, Q) j2 t+ o. D# K
  7. Parameters:
    1 R* ^' Y1 D( k  M\" w1 d
  8.     无$ ~& o3 \9 v; J( u) V8 j4 \. Q
  9. Returns:1 o5 ]6 h& G9 X- z
  10.     dataMat - 数据列表: a. S9 H/ v' [5 {+ d0 s# t5 _
  11.     labelMat - 标签列表2 J5 k/ w\" }. Q) K
  12. """( d% [9 j7 q/ N& `
  13. def loadDataSet():
    ( m' v/ S. L& X( n' G
  14.     dataMat = []                                                        #创建数据列表
    7 u\" i1 X+ m* M9 N! d9 Y
  15.     labelMat = []                                                        #创建标签列表) w  a3 ]+ ]. l. P9 E' y3 B
  16.     fr = open('testSet.txt')                                            #打开文件   
    5 x/ B/ V% @6 y  z
  17.     for line in fr.readlines():                                            #逐行读取$ D  }8 b. g! \  b' P  ?
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
    ( v- m- ~* U/ |$ ?0 R+ V
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    # y. R1 D0 |- E* m5 M6 c' @1 T( N! v
  20.         labelMat.append(int(lineArr[2]))                                #添加标签5 s4 z9 N; A' x9 c1 j
  21.     fr.close()                                                            #关闭文件4 |; b$ b2 ]+ e\" b
  22.     return dataMat, labelMat                                            #返回
    : T+ ^0 I, n' y/ ?# @2 K# L  I) Z

  23. $ A! v3 {: w+ `
  24. """! k8 p* e5 z! {  V; |8 E
  25. 函数说明:绘制数据集
    9 b9 Y0 p6 t; v. j
  26. : v* e8 k& i% Z6 N
  27. Parameters:
    8 ], m5 r% I& F0 c6 d3 P7 m
  28.     无8 p; ]- ^) @+ Z5 i3 w: Y7 l
  29. Returns:
    9 L! m1 p' V* @5 L\" e
  30.     无
    6 b: }6 c( X2 D6 Q; n
  31. """1 K' z, S2 Q. ]& k' J9 I- U. p
  32. def plotDataSet():
    $ D+ ~+ }( Z: _5 N8 C- A
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集/ g, q9 X6 W\" Y; Y' J, b- w
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    5 P% D1 m( g\" S8 t: \& d4 K
  35.     n = np.shape(dataMat)[0]                                            #数据个数2 e1 }- ^8 u' i# {\" x5 ?( j
  36.     xcord1 = []; ycord1 = []                                            #正样本
    5 `2 s. Q: {- A3 G2 i
  37.     xcord2 = []; ycord2 = []                                            #负样本
    8 T/ X: h8 ~% J) v/ |6 Q. t
  38.     for i in range(n):                                                    #根据数据集标签进行分类% g6 ~: \; z5 c5 Q- L% J
  39.         if int(labelMat[i]) == 1:
    9 O% B( z+ ?0 A$ v1 ~6 b4 |- a
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    ( _1 s, V+ v. C# Y/ y
  41.         else:9 L3 ~, G7 c5 o% H9 ]
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本$ ~, F+ |, M3 S0 z
  43.     fig = plt.figure()
    6 H- S6 R. t1 ~  o6 n\" f7 H
  44.     ax = fig.add_subplot(111)                                            #添加subplot: O\" r2 f6 d0 g# Y( v
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本4 E9 g* D# g3 H; L3 o1 z
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本* H1 L+ A7 G- E7 Q5 ^; l
  47.     plt.title('DataSet')                                                #绘制title2 X- K. `* v0 B, W
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label4 O- j9 k7 Q% G: ]1 @
  49.     plt.show()                                                            #显示! A& x# M  e5 J1 a
  50. ( o9 _5 `  G7 v7 E1 d
  51. if __name__ == '__main__':4 G) H  Z) ^5 @( C* c
  52.     plotDataSet()5 w$ W4 A/ J\" V
复制代码
VeryCapture_20231130171817.jpg ( d6 P' n1 n: N3 {1 P
从上图可以看出数据的分布情况。假设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 Z4 v7 G4 s0 N* q* H
  2. 1 a2 p' h! s7 O  }
  3. """& x& B$ p5 e; ]- D1 Q2 s
  4. 函数说明:加载数据
    , u) P# w. V* W% e4 ]) i

  5. ; O4 n' R5 s3 ^% v/ r% V' p/ W
  6. Parameters:
    \" u  b6 _5 J) q
  7.     无
    8 W: l1 m- P+ o; z# D/ ?
  8. Returns:
    - H: d  E  {  N1 q
  9.     dataMat - 数据列表. l* }/ Z: Z$ s/ m
  10.     labelMat - 标签列表* c% |! u0 W$ [7 F6 Q' u
  11. """
    0 v% b\" B: Y: l; w8 p2 P
  12. def loadDataSet():( c* a; Q\" ~) N- ?- C* L
  13.     dataMat = []                                                        #创建数据列表
    \" ]; d  W/ F3 h# h% K/ D+ h
  14.     labelMat = []                                                        #创建标签列表
    6 j) s9 U) O! ?3 [
  15.     fr = open('testSet.txt')                                            #打开文件   : I- o3 S( m- ?/ \7 l- o
  16.     for line in fr.readlines():                                            #逐行读取
    0 Q7 B; W' O3 s5 r. f$ G, A! k: r
  17.         lineArr = line.strip().split()                                    #去回车,放入列表! d: }4 q* q2 l: C- j
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据' P0 p) W& r# w; a4 K' t
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    # `7 b& i0 ~0 A( E
  20.     fr.close()                                                            #关闭文件
    ( k7 k1 e% E0 U; j9 ?1 L
  21.     return dataMat, labelMat                                            #返回
    1 K, J( _+ F4 L% g- m

  22. ! j1 e! O: G9 f8 t, Y2 B
  23. """
    + Q  T/ x& m' O$ Z, _; b
  24. 函数说明:sigmoid函数
    ( X4 ^$ w1 }* _* \6 n) s
  25. 9 J7 O: W9 O& E- y, H! F1 |0 w
  26. Parameters:
    5 S# o0 A7 J; T
  27.     inX - 数据; `) U' j4 A6 [\" l
  28. Returns:
    : Q6 f3 e0 B* Z0 s# m) O6 c  G
  29.     sigmoid函数: y+ j8 U2 c* {$ ]6 R/ \
  30. """
    6 {  z* \% P7 A
  31. def sigmoid(inX):: k/ m/ q$ Q$ `$ x* v: q. P' F
  32.     return 1.0 / (1 + np.exp(-inX))% `' M- E) E0 u2 h7 k

  33. 1 M. h2 i2 x0 A\" ^$ Z/ W; ~

  34. - X' K; c  H1 K3 W# y- ^8 Q
  35. """: X! v9 p0 Z2 E! p
  36. 函数说明:梯度上升算法
    7 V# `2 O# c  ]2 U7 R' D
  37. 4 R4 [9 I6 j1 K0 E( C: n& x
  38. Parameters:9 R# _$ a: D( F* Q# J6 B
  39.     dataMatIn - 数据集/ Z& j8 t  Z1 f' \4 Y( K
  40.     classLabels - 数据标签
    6 e- l# D: b, X\" e% A4 c
  41. Returns:; t1 Y$ T9 e- p
  42.     weights.getA() - 求得的权重数组(最优参数)4 G; n4 e0 u/ E
  43. """  j# R, g# B& E: Z
  44. def gradAscent(dataMatIn, classLabels):( r3 w, O! |\" Y: Q4 X8 g
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat0 B, J, g. b& R# u
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    + J8 ^+ x+ F: D% c
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    + G9 D3 x9 P* o7 g
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
      k+ m* A5 `/ ^- v  o
  49.     maxCycles = 500                                                        #最大迭代次数
    / K5 a0 ]( L/ d, `
  50.     weights = np.ones((n,1))
    ! n; I0 y; h4 v5 ^7 \5 O
  51.     for k in range(maxCycles):
    - w7 I, z7 y4 K  v4 ^8 x
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式  Q7 K) [  l6 L/ i: e3 w& O2 t$ Z
  53.         error = labelMat - h
    ) ~0 n5 X( F# G$ U
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    5 ^# K3 k3 F2 x$ ?5 `3 P
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组2 U; @- r  O: d, o
  56. , V7 N+ x. y, [- a; t! L- C
  57. if __name__ == '__main__':
    8 R& o) i1 a% {2 s5 a9 }
  58.     dataMat, labelMat = loadDataSet()           
    0 G6 T3 f0 m1 d, t2 W, J* R5 ^
  59.     print(gradAscent(dataMat, labelMat))
    ) `! p: ?3 ]0 U! o7 k
复制代码
运行结果
  1. [[ 4.12414349]1 s' s+ O- C4 v, Z! T3 ?8 ~' r# e
  2. [ 0.48007329]
    $ {& d$ a7 R2 K1 |$ R
  3. [-0.6168482 ]]
    * d4 }- {9 a, s+ {+ J! L0 Q
复制代码
/ D& t+ f1 n# v
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-4-12 05:13 , Processed in 0.423576 second(s), 54 queries .

回顶部