QQ登录

只需要一步,快速开始

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

Logistic回归--实例

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-30 17:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
VeryCapture_20231130171540.jpg
  1. """
    & Q0 e* C7 Q7 o$ Y: g
  2. 函数说明:梯度上升算法测试函数
    1 h. A- Y6 ~3 S1 T4 x
  3. / i8 C0 X, p* C9 Q2 A# _$ G
  4. 求函数f(x) = -x^2 + 4x的极大值
    : B8 ^1 l% Z2 F3 i  O2 ]
  5. . A) h) h9 R' k# ]* |/ e
  6. Parameters:: I* R% z, f6 S9 K* M/ _+ d( a7 e) r
  7.     无3 W( z& O& K' ~* G3 |- P
  8. Returns:
    4 i\" E/ S9 X4 f6 h# t
  9.     无
    8 i& Q* t% u1 ?\" L. A\" Z2 G
  10. """' l; Y, _( \8 o
  11. def Gradient_Ascent_test():
    4 U0 z2 \& T4 |* Y8 J
  12.     def f_prime(x_old):                                    #f(x)的导数9 J* s. L+ u) q. H
  13.         return -2 * x_old + 40 B& \: l3 A' D  R; U& g6 F
  14.     x_old = -1                                            #初始值,给一个小于x_new的值
    / T\" t, g- c8 o2 ]
  15.     x_new = 0                                            #梯度上升算法初始值,即从(0,0)开始
    3 w$ `7 k! M4 B$ x8 O1 |7 j5 h\" s* b
  16.     alpha = 0.01                                        #步长,也就是学习速率,控制更新的幅度
    . ~. A& s- m; a2 |  i' `0 k& _
  17.     presision = 0.00000001                                #精度,也就是更新阈值
    $ i3 M5 \  b  B4 J
  18.     while abs(x_new - x_old) > presision:\" S% V\" d/ p7 p5 U) O3 B! E& {
  19.         x_old = x_new0 o\" I- l, r. v( `% M8 M5 _) o
  20.         x_new = x_old + alpha * f_prime(x_old)            #上面提到的公式# g, k% w6 ]  V( F% N: Y9 s; n
  21.     print(x_new)                                        #打印最终求解的极值近似值
    ) d5 B$ D# y2 o- S

  22. % j' k4 S% {+ c+ [* X\" |  v( M9 x- V( e
  23. if __name__ == '__main__':4 |# V1 d5 ~- `3 e% f5 {
  24.     Gradient_Ascent_test()
    ( h+ Q1 j9 N3 b! M) g( h# P
复制代码
运行实例:
  1. 1.999999515279857
    0 J: E; R+ i4 }/ ^
复制代码
案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt
  1. -0.017612  14.053064  0\" x+ p* x$ {/ u: z  p
  2. -1.395634  4.662541  1
    + V6 L/ ?: O! o  ^$ Q/ k
  3. -0.752157  6.538620  0
    % l, p6 @* I\" g$ o9 Y* t3 N; C4 n9 F; L
  4. -1.322371  7.152853  0' t3 X; `% U! P& P
  5. 0.423363  11.054677  0% t/ B1 o' B0 W, |3 ^- F
  6. 0.406704  7.067335  1* d0 y; s1 p+ L# ^% S( ~; a2 q
  7. 0.667394  12.741452  0. b+ [6 R5 D$ T& ]- E; r$ L& A$ _
  8. -2.460150  6.866805  1; H. k' h+ |1 o6 ?\" c
  9. 0.569411  9.548755  0: h. f; I3 n1 e' l9 H/ _# R) E
  10. -0.026632  10.427743  0# s8 r- l2 M# t4 ^( p4 U8 V
复制代码
这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。
  1. import matplotlib.pyplot as plt
    : L6 M* j! Z* o; T
  2. import numpy as np
    7 v1 R, K( D8 J9 V$ [

  3. - K; o4 S7 G7 O% {' \: C
  4. """
    ! Q$ E+ {, o* B) a
  5. 函数说明:加载数据
    1 y8 J! t6 X6 c  ^
  6. ' @. ?( ]9 x* X0 \9 L/ o/ O
  7. Parameters:
    % r* T! R8 |! V# u% P. J) d\" `/ y
  8.     无
    ) T( ]; h8 X) `1 c# \# L
  9. Returns:
    \" D' B* Y& p$ m- M
  10.     dataMat - 数据列表
    \" }6 {/ h0 M! C+ I+ B
  11.     labelMat - 标签列表
    - y( C* G7 _) u; J8 l$ ?* V
  12. """
    / ~+ h) j  [\" L( j
  13. def loadDataSet():
    - V/ z) v5 g# T/ J! G
  14.     dataMat = []                                                        #创建数据列表( j- l+ R2 J( f5 I: X\" {
  15.     labelMat = []                                                        #创建标签列表
    & w1 I0 F# l) D- p: |# r7 [! S
  16.     fr = open('testSet.txt')                                            #打开文件   6 `: N) J+ R  q) a' x2 ^! w
  17.     for line in fr.readlines():                                            #逐行读取3 S9 Y+ N+ V\" Q5 [8 m\" V3 n
  18.         lineArr = line.strip().split()                                    #去回车,放入列表
    0 z\" J\" O4 e' L
  19.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据
    5 s7 e7 C5 o* P2 V3 c. i
  20.         labelMat.append(int(lineArr[2]))                                #添加标签' S3 o5 {4 f8 o; }+ N0 f
  21.     fr.close()                                                            #关闭文件
    $ d) p4 M+ ~4 o8 T
  22.     return dataMat, labelMat                                            #返回
    : `. f- l3 @\" L9 J4 P, ^

  23. 0 X\" C  F/ t( l& V. X
  24. """5 \; L  F% F' {/ \7 h/ N7 w) ^$ K
  25. 函数说明:绘制数据集5 C3 @: h3 c( ~1 {- p( X2 F

  26. 1 ~8 d. K2 F: X( v
  27. Parameters:- @\" H$ c' u  p* y
  28.     无4 g& z! j7 h7 j' }! f1 s
  29. Returns:7 W; a; Z+ g  ?
  30.     无1 A1 W$ x/ @1 l; m7 z$ S
  31. """
    / D9 s  g8 |; `7 @% [( r0 n: n( p4 N
  32. def plotDataSet():
    ' R* K5 V/ j3 F6 j& F7 ~# I- A
  33.     dataMat, labelMat = loadDataSet()                                    #加载数据集
    \" b. Q& F+ R+ Z# c* e) \
  34.     dataArr = np.array(dataMat)                                            #转换成numpy的array数组
    ! I# W/ }% k2 m
  35.     n = np.shape(dataMat)[0]                                            #数据个数
      o$ }: \9 v) J8 S5 i+ S6 I
  36.     xcord1 = []; ycord1 = []                                            #正样本5 o# K# l7 O( B8 m
  37.     xcord2 = []; ycord2 = []                                            #负样本6 |7 D& U4 Q5 k# |/ D
  38.     for i in range(n):                                                    #根据数据集标签进行分类
    8 A, z1 k1 q4 G! a
  39.         if int(labelMat[i]) == 1:, ]/ T3 F% N) c5 v! W; X/ Y( C$ C
  40.             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])    #1为正样本5 x, X% g% `# |# {( Z\" [* ?
  41.         else:
    \" b+ W\" W& n4 }+ q8 N
  42.             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])    #0为负样本
    / x- R6 u3 Y; s# f# E$ o' Q
  43.     fig = plt.figure()
    ' f) Y4 v) R- K
  44.     ax = fig.add_subplot(111)                                            #添加subplot
    # M* v7 c7 \3 ?- j4 t
  45.     ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本5 @/ w0 u& h0 o6 ^! |* K+ B' [2 D
  46.     ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)            #绘制负样本  N  c! G9 X3 y; x- |4 V
  47.     plt.title('DataSet')                                                #绘制title
    ) I& u2 F' g* q! n0 I
  48.     plt.xlabel('x'); plt.ylabel('y')                                    #绘制label
    ' ~1 a* F' ?8 m# k
  49.     plt.show()                                                            #显示
    3 ?1 W\" C, ?5 l- i% b* G3 y5 g: k
  50. # r$ c% R5 }9 }4 i  Y: [; x
  51. if __name__ == '__main__':
    ! s! S& T0 _) s8 X' Y% d
  52.     plotDataSet()
    . `7 Z$ P* p5 y5 \2 ~
复制代码
VeryCapture_20231130171817.jpg
: m# [  ?: N$ r+ M0 K# 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 np6 o6 ~2 |! i  r
  2. 5 M\" _' v: U8 ^  ]+ ~9 C0 K  V* ]0 t
  3. """
    4 w: W; q\" i- G- p
  4. 函数说明:加载数据8 o) w+ Y7 a& M\" W$ r% H5 b0 K
  5. 7 \1 L- w6 T- A- L
  6. Parameters:
    ; _6 q( B. o9 B
  7.     无
    4 Y) Q* T* _9 e5 B, H& f
  8. Returns:
    $ J3 n4 Y$ \2 p2 O
  9.     dataMat - 数据列表  j. a+ @3 E* F\" Q
  10.     labelMat - 标签列表
    , w& g' d* E( b  f
  11. """
    & d9 M4 j) _- Z! ]2 o/ Z! r/ m
  12. def loadDataSet():
    ; x3 w: T1 C: ~
  13.     dataMat = []                                                        #创建数据列表; w, T7 O) }8 b0 a& G
  14.     labelMat = []                                                        #创建标签列表
    * O4 O% ?* v; e7 {( M\" d, ]
  15.     fr = open('testSet.txt')                                            #打开文件   6 H$ Y) f; R6 n4 w3 a0 [
  16.     for line in fr.readlines():                                            #逐行读取
    , D, v6 m$ E! r0 K' R; D& a
  17.         lineArr = line.strip().split()                                    #去回车,放入列表0 c5 S/ F* |# G# z, l# I. I8 C
  18.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])        #添加数据; e* I: c$ e, p\" z9 `  a% O; |
  19.         labelMat.append(int(lineArr[2]))                                #添加标签
    & }  i$ f$ r1 s) u
  20.     fr.close()                                                            #关闭文件
    4 _: M( |( W8 B9 n' u3 [
  21.     return dataMat, labelMat                                            #返回6 |# @4 Y; i8 H+ Z' N
  22. 7 w, {6 O; `+ v0 n2 x5 h
  23. """
    4 T  h  ?, k+ f: Z
  24. 函数说明:sigmoid函数
    / ]7 R, @5 K  P  d1 b# V

  25. \" J& _% n0 c7 V\" N' ]
  26. Parameters:
    % w! I2 G. g5 y
  27.     inX - 数据$ }) K% W8 O\" H# Q4 X
  28. Returns:
    6 o3 ~1 {; w7 n1 ^6 \6 @
  29.     sigmoid函数4 G9 K* v* d+ L# V& b\" G& R( O
  30. """
    : N9 o6 C+ H4 U& ^1 x; @9 E
  31. def sigmoid(inX):
    6 @+ V2 V7 C! }\" [+ s4 _3 z
  32.     return 1.0 / (1 + np.exp(-inX))
    ' l. Y1 F$ O0 u, J9 T* d
  33. 0 ~9 A) d/ x3 o3 \9 G9 P
  34. + H; }  A4 Q4 T, P& \
  35. """* o4 P; m4 G! c5 y- U
  36. 函数说明:梯度上升算法6 T$ T3 X5 t1 l% ]1 C8 m

  37. 6 w3 Q3 H3 i: M
  38. Parameters:6 S: |' V8 }/ V6 Z7 f! ?
  39.     dataMatIn - 数据集. v) C1 z2 w+ X, K9 A- n
  40.     classLabels - 数据标签
    + Q. O# j/ U: P8 t- \
  41. Returns:
    ' d$ L1 f1 L% x8 D7 G
  42.     weights.getA() - 求得的权重数组(最优参数)
    ; K, ^, p% l% Q/ K3 p
  43. """2 ~3 I5 s7 h) M# c, V1 o
  44. def gradAscent(dataMatIn, classLabels):2 W, H' f) T. f# H/ V' b4 {  @, J
  45.     dataMatrix = np.mat(dataMatIn)                                        #转换成numpy的mat* y) T\" t6 v+ e( [
  46.     labelMat = np.mat(classLabels).transpose()                            #转换成numpy的mat,并进行转置
    $ E7 w* T# g2 b
  47.     m, n = np.shape(dataMatrix)                                            #返回dataMatrix的大小。m为行数,n为列数。
    ; d8 v% ~$ e/ h( y4 |6 V
  48.     alpha = 0.001                                                        #移动步长,也就是学习速率,控制更新的幅度。' ?( H' ~, C; a* u/ S: I9 C
  49.     maxCycles = 500                                                        #最大迭代次数) O* b8 d. T4 E3 }: y
  50.     weights = np.ones((n,1)), l) q: \. Y0 d. o  G/ r
  51.     for k in range(maxCycles):
    - K% ^+ H5 b, E4 f  J( g- q
  52.         h = sigmoid(dataMatrix * weights)                                #梯度上升矢量化公式
    \" D2 @0 T, L& c- X
  53.         error = labelMat - h3 D$ x# x  J, ?+ W7 q! u! z5 R. K
  54.         weights = weights + alpha * dataMatrix.transpose() * error2 j/ `. l9 V8 S2 g. L
  55.     return weights.getA()                                                #将矩阵转换为数组,返回权重数组( v6 o/ U3 j0 f4 n8 v) S9 {

  56. ( L, ~. T+ D1 n6 |( N% v! w3 \2 _
  57. if __name__ == '__main__':
      O7 w8 E  h( S* N+ X
  58.     dataMat, labelMat = loadDataSet()           
    \" O! W; w: b) T( z( H' L
  59.     print(gradAscent(dataMat, labelMat))
    / A2 U3 m( a* G$ S5 O/ }/ Q2 U! A
复制代码
运行结果
  1. [[ 4.12414349]6 I9 N2 j  t3 z
  2. [ 0.48007329]
    ! U- V9 H  t# r
  3. [-0.6168482 ]]
    # C) J8 r. R; C9 F7 S
复制代码
  p3 H- R3 Y7 |8 g( ?- e
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:50 , Processed in 0.450238 second(s), 54 queries .

回顶部