QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """% O\" C: Z\" }. V) G. U
  2. 函数说明:梯度上升算法测试函数6 v4 x) V4 }# r# F& g5 i( k

  3. \" ~/ x\" K4 h0 p
  4. 求函数f(x) = -x^2 + 4x的极大值- N6 _) H. ?+ E. a4 y* G
  5. 8 q3 q8 {. W$ I/ h% `  `
  6. Parameters:& d' C/ ?3 a, H& A
  7.     无, J+ H3 b1 h9 L8 ~  i* V* e
  8. Returns:
    3 q; p1 h\" e: \/ }8 I' B% ^
  9.     无( W: A: c% v/ ~& ]3 c0 Q* y$ O
  10. """
    / b: f% Q- c9 y\" I8 m
  11. def Gradient_Ascent_test():2 [; o  p) ^, {# J
  12.     def f_prime(x_old):                                    #f(x)的导数
    * v* w0 N4 C, K\" p
  13.         return -2 * x_old + 4
    ! G! t: S8 q, \2 [! G
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    7 j7 X0 J  b\" p0 n+ G
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始1 r1 b% O; d2 o2 S
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度! h! x1 j8 K, }& Y
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    / _2 k! ]% h$ p- o* Q! R
  18.     while abs(x_new - x_old) > presision:! |! X$ d/ j1 |) c
  19.         x_old = x_new
    / w0 |% w+ N. n+ Z8 ~- i4 q$ f
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    * I+ o0 V0 _+ m3 n. e
  21.     print(x_new)                                        #打印最终求解的极值近似值& }6 U# C0 ?  M; w4 V0 m6 [
  22. ; Y' u: f3 v8 l* ^
  23. if __name__ == '__main__':
    - t9 s3 S1 O: Q6 {0 H! H
  24.     Gradient_Ascent_test()5 f( o+ w9 g4 X& w
复制代码
运行实例:
  1. 1.9999995152798575 j; N! l% n/ t
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0  C) h# n6 V2 y: B\" d
  2. -1.395634  4.662541  1* x; Q, G, [  S/ v* @
  3. -0.752157  6.538620  0
    ! C) s0 X9 A8 T2 z. T\" m
  4. -1.322371  7.152853  0
    3 `( Y; F% g5 {! }: h) E3 p9 T: A
  5. 0.423363  11.054677  0
    * `\" ~: l4 G( \7 d6 @; b
  6. 0.406704  7.067335  15 P9 @8 I/ \6 d, t, H: q- W! a
  7. 0.667394  12.741452  07 }# P4 ~7 }% c1 s
  8. -2.460150  6.866805  15 y/ [8 I. V8 N8 F4 D3 p/ L
  9. 0.569411  9.548755  0
    8 f  G; _$ V& [( K6 E6 D1 {
  10. -0.026632  10.427743  0
    ) _* A7 [. m& n$ i2 R7 r3 ?% M. K
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    4 K5 {4 |+ K( G; }* n$ |: [' J
  2. import numpy as np
    - ?5 R5 a( A& p7 }- _
  3. . a( ]2 ^- ]; d* ?
  4. """
    8 \2 x4 G+ d, g* m
  5. 函数说明:加载数据
    , i  \3 S: Q( _4 q
  6. 3 H4 t1 v0 x& F& e0 {, f, |8 i* [/ \
  7. Parameters:; a1 J/ c+ M5 I+ X/ n$ }) ^
  8.     无
    9 Q7 ^3 D  G0 M* k- f* H/ ~
  9. Returns:$ d# p- ?% N0 R/ J  g* _: p
  10.     dataMat - 数据列表5 i/ `2 T- n! {6 H
  11.     labelMat - 标签列表
    0 N3 Q& `( a2 ]7 G% G0 s
  12. """6 l$ K( f\" q4 O6 w& i$ M\" R
  13. def loadDataSet():- s8 @. C' \1 P# [
  14.     dataMat = []                                                        #创建数据列表. @- N6 S* d, J9 k' \4 r4 K\" n
  15.     labelMat = []                                                        #创建标签列表
    \" }8 K$ C# v\" @/ `7 H% g
  16.     fr = open('testSet.txt')                                            #打开文件   
    # v7 i0 f5 L, e( V1 ]& h' F
  17.     for line in fr.readlines():                                            #逐行读取6 u! r5 a3 f* j) M) O
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
    6 |, {; v- W0 F6 N\" o+ W* T
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据3 l. g! _1 j3 g' ~0 p1 g/ O! s
  20.         labelMat.append(int(lineArr[2]))                                #添加标签; j+ F! `3 x# j$ V: B1 _+ y
  21.     fr.close()                                                            #关闭文件
    # H- q7 _4 z( N+ s! b# t
  22.     return dataMat, labelMat                                            #返回
    - v  @- f. M: h7 M# |. w

  23. 1 ]8 }/ D2 v0 Z
  24. """3 \( r6 o7 Q# b* H( m6 Q; X
  25. 函数说明:绘制数据集% |: W- I/ S  e, O' b8 Z! U

  26. 8 y' w1 ~\" B' \\" [\" c
  27. Parameters:+ `: O& m. i. ?/ N9 s, g- p7 T9 b. L\" U
  28.     无
    8 d) W\" E& }2 u& j7 z0 S
  29. Returns:7 y3 T' D. r6 D4 q+ i  p3 C
  30.     无
    / J' Y+ W- @# C4 c/ C5 G! m
  31. """
    \" j  P0 Z; }7 v) H  B\" p  h
  32. def plotDataSet():
    - A; J\" D/ V: s# m5 H/ K
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集4 h/ W\" F0 N: \  Q6 r6 A
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    3 B2 s) Y! l4 q. D/ v& @
  35.     n = np.shape(dataMat)[0]                                            #数据个数
    0 m; c& |) \8 u- H
  36.     xcord1 = []; ycord1 = []                                            #正样本
    9 h; x$ Z. G& c& q* \7 O* m6 }
  37.     xcord2 = []; ycord2 = []                                            #负样本& g/ \$ U( v3 {
  38.     for i in range(n):                                                    #根据数据集标签进行分类# V9 T% h8 q% L0 L* p% b8 g
  39.         if int(labelMat[i]) == 1:% J  [  u+ F% V' C, Z
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本. A7 X. B! t5 M# ], b
  41.         else:
    / O: {. w( k# a\" I
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    8 v1 |4 j- o+ n+ r2 `
  43.     fig = plt.figure()
    ( a! x4 s0 H5 J8 R
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    # s# v- ]6 g3 \! A9 |* \% @' L
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本' G. r# \! S5 a. D$ ?
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本: Q) {2 ^6 q; Y, K( {  A
  47.     plt.title('DataSet')                                                #绘制title& H4 V2 Z\" g8 j
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    0 `* x  J8 K' C2 N3 |
  49.     plt.show()                                                            #显示2 c1 b1 A\" K' g1 ~: t: t3 T* P4 N
  50. & m) ~\" l7 b) R3 j2 i
  51. if __name__ == '__main__':8 {6 g+ O: j9 L, t* _: c
  52.     plotDataSet()
    * a$ T# h  c6 G1 n
复制代码
VeryCapture_20231130171817.jpg
2 a' F& G$ P% \- G  N7 [从上图可以看出数据的分布情况。假设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\" v- z1 m\" H+ Y4 W\" L
  2. / M2 l6 N1 @( E0 x& S
  3. """# h# `' @: Z# W; A
  4. 函数说明:加载数据: M9 d: K. n4 {0 O/ r; b4 C\" H

  5. % |# Y\" W6 M& f7 y# x6 H
  6. Parameters:4 y/ }, s0 h& L9 q+ N# S$ Y/ T
  7.     无/ s. s2 p- X* V1 v
  8. Returns:$ u2 D7 L/ ~/ i
  9.     dataMat - 数据列表3 O7 s\" t  j7 C2 S9 z- `- P
  10.     labelMat - 标签列表
    * f; V7 r$ Z# p& Q# s
  11. """\" W( S; E' y2 M' d
  12. def loadDataSet():; A' O$ _\" ]+ i- p( h' l2 L  j7 t
  13.     dataMat = []                                                        #创建数据列表! m4 P1 e  Q' a, |% G
  14.     labelMat = []                                                        #创建标签列表7 g) U1 a* j2 t% v7 f  f: e
  15.     fr = open('testSet.txt')                                            #打开文件   
    3 D. \& k& c( a2 Z
  16.     for line in fr.readlines():                                            #逐行读取
    6 b- z5 P! U; z- j5 ?% {\" p
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    ) z% h8 a\" X0 c6 x2 p2 _/ z6 _
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    0 h* U2 c! A  ~  w8 V) X: f1 D
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    : w* [1 ]; H5 b) N' M1 }- s+ d0 ~\" N
  20.     fr.close()                                                            #关闭文件# L7 Y& C/ @) ]
  21.     return dataMat, labelMat                                            #返回) M- C; X! Z+ v5 \\" i  H+ g

  22. \" A- n6 H( Y; U
  23. """% \; u$ f/ @# H3 j3 `3 b' K( \; r
  24. 函数说明:sigmoid函数
    \" b- P1 a) ~& C2 ^

  25. 2 D. q) R' Z/ x' ^8 R
  26. Parameters:7 W1 t0 y9 ]7 F9 `7 n' T+ Z
  27.     inX - 数据! l' T5 A$ \\" C) U
  28. Returns:
    1 C$ \2 S8 X1 d# j8 f! W) [! R- B
  29.     sigmoid函数5 P: k\" j, w+ U. t' o, |
  30. """! w  Y3 O* Z, ]' o
  31. def sigmoid(inX):: F1 g( }3 _+ e9 {
  32.     return 1.0 / (1 + np.exp(-inX))1 m# F2 X) P1 k4 i
  33. ; c! s: V# q4 K

  34. . P6 P( M  r- p7 `1 l8 u8 H
  35. """
    5 t- R; U7 w: r$ [: P- D  @/ u+ u
  36. 函数说明:梯度上升算法, d# a& l/ c- b- f

  37. * T' U( \# t6 ^7 V: c: S  y
  38. Parameters:
    7 H( b; h5 y/ @$ p
  39.     dataMatIn - 数据集1 _5 X) |7 r* I) c
  40.     classLabels - 数据标签\" T- S5 C1 a  M6 ?- d; Q) k
  41. Returns:
    9 m+ l6 f& T( T# v
  42.     weights.getA() - 求得的权重数组(最优参数)# ?: a) |6 d, `* O* i7 Y' K
  43. """+ O  _. ?* u: U/ B! m; [
  44. def gradAscent(dataMatIn, classLabels):
    ! h+ M7 i# k4 ?
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat3 d2 A4 A5 n* ?7 x1 _8 s
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置% `5 M6 O! ^\" @; u% j+ [0 G% s
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。- V\" t1 j\" z( I8 c7 Z
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。
    - C- x( U3 u& _% ~4 N- T9 k, F
  49.     maxCycles = 500                                                        #最大迭代次数$ G! B7 f. M3 L3 l$ R
  50.     weights = np.ones((n,1))' g. w\" F' x5 f5 B- R; @\" }
  51.     for k in range(maxCycles):
    / `2 K4 U4 g2 x0 A: L) Q- L
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式9 l; W4 s) Q/ Y, [  ~- D6 |2 Y
  53.         error = labelMat - h
    & O  d8 _& W& Z
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    * b) o5 i: |/ C: t
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组
    2 {$ s8 E7 d: [\" E2 e
  56. 8 S) r& M; N. g6 G
  57. if __name__ == '__main__':
    & y% @7 I  l6 ?+ `9 ~$ F9 L7 M
  58.     dataMat, labelMat = loadDataSet()           7 }# Z& e5 |- a% t) i8 W1 }* E
  59.     print(gradAscent(dataMat, labelMat))
    2 {. z\" ]3 t' G0 k( O: L. M/ W8 Y' @
复制代码
运行结果
  1. [[ 4.12414349]% U% z: |# J6 H8 Z/ D) x( P  m7 ^) b4 N
  2. [ 0.48007329]( A+ u$ ?! k3 s/ S
  3. [-0.6168482 ]]; f8 B  }+ b' k\" O( w+ s5 I: u
复制代码
' L" `, ?* ^' W5 X! j' A% O
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-7-10 09:26 , Processed in 0.383312 second(s), 53 queries .

回顶部