QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    ) u0 I2 I) \& e2 h$ ]
  2. 函数说明:梯度上升算法测试函数
    % A# |6 @& P4 w
  3. ) o  C, K5 x% u/ [* ]. e
  4. 求函数f(x) = -x^2 + 4x的极大值4 z/ v$ y8 j; o( L5 S+ `( [
  5. $ q0 d& m1 w( |( l
  6. Parameters:
    ) X. F0 H' Z: t
  7.     无0 \2 f7 T/ M0 W( k
  8. Returns:
    ) F& c; A0 D$ M9 v\" I- r6 j
  9.     无
    2 {% r4 M% o. m* Y) o. }3 x+ [' ]
  10. """( A/ f  _) E9 r) k. @( q: S3 n
  11. def Gradient_Ascent_test():. H. p\" e+ v; H% _6 V\" E, [; {8 F
  12.     def f_prime(x_old):                                    #f(x)的导数\" A/ Y6 g2 p4 z2 N$ X% w7 ?
  13.         return -2 * x_old + 4
    , M4 ?* v% Q7 t
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    $ s; m: B' ^' U3 U  i  y, t
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始- B7 }0 {$ ^7 M\" ?' o1 n. t
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    / s3 Z! @% v5 ~7 j; `/ |
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    1 O6 H, L% y3 K* ^& ^
  18.     while abs(x_new - x_old) > presision:
    3 a) R$ I9 Z# u6 b+ @
  19.         x_old = x_new; M3 x0 k\" \7 }2 g
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式
    / R- q$ V: y3 D3 J
  21.     print(x_new)                                        #打印最终求解的极值近似值, M, O6 k$ _, C8 @$ I8 `3 i4 B8 t
  22. ) `% A\" i, ]8 _
  23. if __name__ == '__main__':3 E- x! e' \% T( F) A* e9 u! N) M' p/ |
  24.     Gradient_Ascent_test()/ o, }: G- |; S4 q- J0 p
复制代码
运行实例:
  1. 1.9999995152798573 e% o7 D4 V+ G\" v; l9 A
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  06 v: m4 t\" c. g/ L5 r  s
  2. -1.395634  4.662541  1) W, I$ O1 U9 X% y; D3 K- v/ X
  3. -0.752157  6.538620  00 |. C. }8 O( H& N: y
  4. -1.322371  7.152853  0% @5 ?) l/ Y3 s1 h: `- q) P
  5. 0.423363  11.054677  06 y, P% U  D: p. l# n* V, |! d, d
  6. 0.406704  7.067335  1! l* h0 C9 V) j) S1 b$ ]
  7. 0.667394  12.741452  0! j$ K4 W* g\" j' P
  8. -2.460150  6.866805  1
    , L. w. G( `6 x+ I3 N
  9. 0.569411  9.548755  0% o# X$ N$ R6 l8 ?+ m6 ]8 V
  10. -0.026632  10.427743  00 b& n' d1 j! ~% N. G
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt( q. @$ L9 O( t3 |% d, h& T
  2. import numpy as np
    # _( B3 r2 k# M$ l! |

  3. 5 [% Y  s$ Y  z4 g9 N
  4. """
    $ s# U. p) `3 {% ~- ^+ c
  5. 函数说明:加载数据
    . I, z6 `) w4 d
  6. , B6 g4 J* J( Z1 H$ G4 V4 O
  7. Parameters:: U8 G+ h  z7 B+ T4 b
  8.     无4 Q, {) A3 {\" G7 _
  9. Returns:
    + v7 g( c6 A% s: c( W
  10.     dataMat - 数据列表
    0 l' n# s. I# L\" {& }% ~
  11.     labelMat - 标签列表
    9 p# ]6 x7 b! |2 B0 S
  12. """2 x5 v) h6 {- G7 g+ u\" l3 p8 i
  13. def loadDataSet():
    & t0 \3 L0 a0 y7 N) y
  14.     dataMat = []                                                        #创建数据列表
    2 {3 U. v8 d* o) I4 |
  15.     labelMat = []                                                        #创建标签列表
    , T  |3 E9 Q4 t' Z0 M
  16.     fr = open('testSet.txt')                                            #打开文件   
    0 q9 M1 T3 O2 ~1 ]( X  s
  17.     for line in fr.readlines():                                            #逐行读取
    3 ~$ x6 ~7 E+ `- }7 u& y; d
  18.         lineArr = line.strip().split()                                    #去回车,放入列表- x6 X\" D+ f- q\" f1 W' u
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    . Z- z: K  Q0 H( l' M$ h
  20.         labelMat.append(int(lineArr[2]))                                #添加标签
    $ J$ Z7 U' G  f6 [4 o( [( w! `( v
  21.     fr.close()                                                            #关闭文件) v8 L; n/ c4 I# \
  22.     return dataMat, labelMat                                            #返回4 u1 l) C5 F7 J, ~: }/ {
  23. 9 a' @7 N4 Z, [2 Y: A! n
  24. """7 s1 t! h, e0 U) M* k8 ~
  25. 函数说明:绘制数据集
    + Y* z, I\" F8 ?/ ~! A! M& [* Z
  26. / \9 C; a7 o) Z% P5 X; s
  27. Parameters:
    6 v' @+ |  z  {
  28.     无) M- R  j- ]\" c' k; ~% P+ {
  29. Returns:0 d# u0 `+ G1 T( \
  30.     无
    % {4 J9 K1 e4 J3 Y' s
  31. """
    4 ?( N* h# l, \* M& x* M) ?
  32. def plotDataSet():\" Z! R5 j# R1 p
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    8 u% h; \8 ?; u# n* F
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    ! p4 d; t' k; h
  35.     n = np.shape(dataMat)[0]                                            #数据个数# z- J' G$ U& m0 M! ^$ h( v$ ^
  36.     xcord1 = []; ycord1 = []                                            #正样本
    ) Q% _/ A; L. r5 _) _$ J4 J
  37.     xcord2 = []; ycord2 = []                                            #负样本
    $ |) d/ Z: C3 R4 v2 b
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    4 G& g  L  T4 a) I' J9 L
  39.         if int(labelMat[i]) == 1:  j6 k2 f! L! w9 ?9 x8 H) h. }$ Z
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本
    6 D: \1 A' e0 n3 Y- |! G: a3 k, a
  41.         else:
    . M/ I' q, k3 Y
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    9 ~0 S( X- U% d/ U4 |
  43.     fig = plt.figure()8 x  X& I3 n5 x
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    + D* b\" D% s4 e. w9 W* }
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
    5 S! W1 D2 m  R/ Y7 m* r/ m
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本
    . E\" N. I' R4 y$ Y
  47.     plt.title('DataSet')                                                #绘制title0 {- r* p2 \0 b
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    8 a+ V2 z) Q! Y  L& t
  49.     plt.show()                                                            #显示$ f% H/ k4 C9 k+ Q\" I  [

  50. \" U* f( e8 Y0 F7 p$ A
  51. if __name__ == '__main__':
    / q0 i( `/ I3 p. D5 o. D
  52.     plotDataSet()
    6 Z3 \\" p4 s! u
复制代码
VeryCapture_20231130171817.jpg
9 q: X- J4 I' G; B2 V从上图可以看出数据的分布情况。假设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$ }! `/ ^* Q- @8 @& Z0 c% x5 o

  2. & ~# {0 K- l5 D' o5 i# h2 N
  3. """+ l1 d8 h0 \* h+ V0 w
  4. 函数说明:加载数据- J0 }- z. l4 y
  5. 7 k0 a& U5 o0 N, ^
  6. Parameters:
    - c! i& m\" C4 I/ J! s# y1 M
  7.     无* O* B# R/ U2 Z6 u# \/ q
  8. Returns:  o* G7 ?; v# u8 C% S* p
  9.     dataMat - 数据列表- P; u1 z% P* b1 T/ G
  10.     labelMat - 标签列表
    . f; W( P% w\" D7 H; A7 B2 d
  11. """, h. E\" }1 J: M( o. P\" G
  12. def loadDataSet():\" W! ~( Y. e- E5 a9 }\" w2 p2 w0 c# c
  13.     dataMat = []                                                        #创建数据列表; |) N7 Z! O9 G. y
  14.     labelMat = []                                                        #创建标签列表
    7 g1 A! u/ N* U' U. J3 \6 ?
  15.     fr = open('testSet.txt')                                            #打开文件   
      n& U$ x6 z- W2 c' u, s5 q/ Z
  16.     for line in fr.readlines():                                            #逐行读取: g+ F& z5 ~: i
  17.         lineArr = line.strip().split()                                    #去回车,放入列表
    . |\" U' _% J  r
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    / n8 d+ v5 {9 R- `9 @% }. ?& k
  19.         labelMat.append(int(lineArr[2]))                                #添加标签! s8 {, l9 e6 u
  20.     fr.close()                                                            #关闭文件
    1 z3 a' m  L+ {\" T2 j2 h/ c
  21.     return dataMat, labelMat                                            #返回. c  v% b# l1 r7 W

  22. ( r/ P* b4 E( M# g
  23. """' @( F\" @, O& j0 Q9 H& }
  24. 函数说明:sigmoid函数: j, t1 E  A- T. g
  25. ' s' l5 ?5 R% l. [( l& F2 _' E$ G
  26. Parameters:
    6 R# v) s2 N1 `, R- H
  27.     inX - 数据& Z$ j4 }( `& G
  28. Returns:! g+ c8 B7 ^3 i3 a- ]( M3 b6 I
  29.     sigmoid函数
    . `5 ]) f$ W3 G- V7 l3 ~. l8 K
  30. """
    * @9 w/ a! e; S
  31. def sigmoid(inX):
    , ?! h0 r' i$ z$ N# O) n2 r
  32.     return 1.0 / (1 + np.exp(-inX)), T/ {! L; D( G1 ~# j, N% U
  33. 1 A+ I* l: d/ k. }) L' `9 f
  34. + B, p5 a\" V0 a% v! |
  35. """( o& @4 x3 B\" @
  36. 函数说明:梯度上升算法; R2 ~, C& Y$ Y2 J3 x) \
  37. + }, F2 y9 |4 s- A: D
  38. Parameters:3 ^( \2 G; q- k# g% |: X8 S
  39.     dataMatIn - 数据集  y! O\" J/ n' x* ~, @
  40.     classLabels - 数据标签
    / E0 {: l4 v$ v) C% q  S
  41. Returns:2 P: H9 X8 [' X) S0 U5 C- ?
  42.     weights.getA() - 求得的权重数组(最优参数)
    4 P! n7 v% m\" P' ]
  43. """
    # [% L) G! N: d; x. T7 ?7 j, F
  44. def gradAscent(dataMatIn, classLabels):
    ! H% T' @$ r1 x' z
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat
    2 k7 C. X5 ^6 i9 Y+ @! R
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置( f; U2 P6 s1 M
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。9 E/ B, B* F. z8 |- t$ `
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。, J( ~3 ?/ p! J
  49.     maxCycles = 500                                                        #最大迭代次数2 H3 ^2 ~9 y: x8 x- T( f9 z0 O& i
  50.     weights = np.ones((n,1))
    0 }0 h3 o3 B7 R! e
  51.     for k in range(maxCycles):0 v0 Y4 K/ y5 ]: R
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式3 b! I\" m1 R- ?9 m8 \0 y6 v. a9 ~
  53.         error = labelMat - h
    , d' u4 u! m$ U, S( \
  54.         weights = weights + alpha * dataMatrix.transpose() * error
    0 Z& {1 k4 ~: N: E' J
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组+ W, l! A% v' d4 X3 u
  56. 1 H. l# y' S4 r$ Y+ h8 X: i\" _
  57. if __name__ == '__main__':5 j0 J4 A  w  n8 N
  58.     dataMat, labelMat = loadDataSet()           
    \" C3 t7 T% j; q4 |
  59.     print(gradAscent(dataMat, labelMat))  r; ^7 y* k: E2 D9 g1 m1 ~$ s$ p
复制代码
运行结果
  1. [[ 4.12414349]
    7 G8 k) E# q& L7 T2 r8 ?
  2. [ 0.48007329]
    % d3 h/ n  H+ x7 \9 r# W8 _
  3. [-0.6168482 ]]! e! f+ @( a5 Q8 B' {' x7 t9 K
复制代码
/ B  y8 X8 ~" R) o4 I( 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-4-16 09:24 , Processed in 0.452178 second(s), 53 queries .

回顶部