- 在线时间
- 479 小时
- 最后登录
- 2026-5-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7813 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2931
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1173
- 主题
- 1188
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """
2 L$ r. ^- `- g7 [, }) V: H - 函数说明:梯度上升算法测试函数
3 Q* l) E8 Z9 p6 z3 F3 m! B' q! I
3 i; _% k1 ^: [: Z. I- 求函数f(x) = -x^2 + 4x的极大值, M$ U O, g- m2 o1 V, x8 [2 d
2 t4 I, E+ h# Z% M) `. w- Parameters:( D8 s2 i' B0 ]) U
- 无4 c: _2 g+ R, x3 J6 F h( V
- Returns:
+ O5 `, M7 C1 Y4 W0 s1 D9 \ - 无
' S7 B0 w' w) Q- N- g6 X/ _$ U+ C - """0 w2 ^) z; M6 E4 q( u
- def Gradient_Ascent_test():
9 W8 f8 z6 M# \: m( H- Y - def f_prime(x_old): #f(x)的导数( P( g! N* X; p0 p) ] B
- return -2 * x_old + 4
. C$ _/ m+ n% X - x_old = -1 #初始值,给一个小于x_new的值& C4 B' l. t) H
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始 n8 H0 A8 t. s$ a4 l3 a, U
- alpha = 0.01 #步长,也就是学习速率,控制更新的幅度& |4 b8 J0 T. v2 Z: X/ X
- presision = 0.00000001 #精度,也就是更新阈值8 i$ p4 w) b0 ^- C9 R3 j4 ]
- while abs(x_new - x_old) > presision:4 P% q0 h7 R4 c/ E/ u/ T& F% ]& s
- x_old = x_new
9 P4 j/ e3 l' e7 p7 y* _# p - x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
9 I/ W3 p+ O# K, W/ M. a - print(x_new) #打印最终求解的极值近似值+ P0 n\" X% `7 O' w1 H/ ~/ z\" r; ^0 b
. X4 V$ }0 h' k5 s. c- if __name__ == '__main__':
5 u. }0 Z+ j3 C% j! y - Gradient_Ascent_test()
2 U0 r Q/ O- i7 k( h
复制代码 运行实例:- 1.999999515279857* }6 X) v _4 K- T
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0& i$ I8 `! g2 S8 ~9 @( }; o
- -1.395634 4.662541 1
8 u/ e. X) \1 d9 r - -0.752157 6.538620 0* U! G9 J: q\" x+ f! a
- -1.322371 7.152853 0
; k! J( T9 @, G2 m - 0.423363 11.054677 0\" R4 c/ _/ v& N
- 0.406704 7.067335 19 l2 X0 A7 j% |- U. Q
- 0.667394 12.741452 0
- v v0 E4 ~+ g0 ^1 {\" q - -2.460150 6.866805 1
4 W- D, V+ t' C0 S: \5 I - 0.569411 9.548755 0* s9 g& z2 ?- e5 X# r; h
- -0.026632 10.427743 0) \\" c- y, E4 e& Z& V
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt
\" N8 S/ H0 R$ ^% C - import numpy as np
6 k& r n# ?. _. G
4 }3 p( D% n, b- """
2 ? K\" T1 i7 W, j* y0 x - 函数说明:加载数据( b) F( E) R. Q4 ^6 `& s
- : w) I; M% d, [7 [\" c: X\" F6 o
- Parameters: U P2 e: X* G\" y% a6 v- `\" y
- 无 q/ M+ z# t, H& m
- Returns:4 \ n8 G/ v6 e; z' ]/ x
- dataMat - 数据列表
. @7 N: W) a\" v: X | - labelMat - 标签列表
! ^ R\" C% f, j - """' F4 F$ `; W+ y\" ]1 I6 i+ h
- def loadDataSet():2 m\" c/ K x9 Q1 N3 y5 }9 e& @
- dataMat = [] #创建数据列表4 ~1 e4 V. y, F$ F8 V s
- labelMat = [] #创建标签列表
* w; K: e8 Q$ L; T, ?' a, h - fr = open('testSet.txt') #打开文件
4 e\" G5 J) N6 C K. m - for line in fr.readlines(): #逐行读取
$ Y6 s- }; t, C% D( Y9 H - lineArr = line.strip().split() #去回车,放入列表# ^. N+ I5 x. F\" p, { A0 n
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据2 Q- T\" g* \/ y2 L' j8 [3 B6 o! w& y* t
- labelMat.append(int(lineArr[2])) #添加标签
! O6 T* g5 r# S3 d } - fr.close() #关闭文件3 x/ n3 s2 X3 c# A# i' t
- return dataMat, labelMat #返回$ y\" u# U\" o, }( F# Z# |' n
7 Y9 m: K8 o\" @' }- """6 p) H# }7 y3 v* B; Y
- 函数说明:绘制数据集; O, h2 z: H5 F% T% X+ ~# w$ i
: C8 [; Q3 ?3 Z9 L% W2 ^) S+ w6 X- Parameters:& F/ M e7 _# A9 K\" Z\" T; a
- 无5 H$ R2 l1 T5 z7 @* F
- Returns:4 w) h2 d0 t) J' }* Q- T\" [
- 无8 H9 A( o t0 h* Q) q
- """4 v' T, {# \& U4 D$ x/ w/ A7 L- e
- def plotDataSet():; N5 G [- l0 C! ^ c1 P& h
- dataMat, labelMat = loadDataSet() #加载数据集5 ]( I' m3 i\" A y5 z& W/ i7 k2 |
- dataArr = np.array(dataMat) #转换成numpy的array数组
T3 l6 O, L9 k0 h - n = np.shape(dataMat)[0] #数据个数
* [3 J# @7 U) P9 J i. x5 M N - xcord1 = []; ycord1 = [] #正样本
4 K5 R. c$ l% B7 K% x- P. P - xcord2 = []; ycord2 = [] #负样本8 Y C. U- q4 t2 ] A& Q: \
- for i in range(n): #根据数据集标签进行分类, K+ ~/ i, a* T6 M r0 {
- if int(labelMat[i]) == 1:0 V$ p/ U7 P3 n9 I; l0 f2 O
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本; [' \; H. B8 v7 R$ p' c. U
- else:
\" l$ o i5 e2 i6 v* w7 U, G - xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本
) s. F6 `- A# x' R7 [ - fig = plt.figure()
, [; L b# F/ ?1 E$ i - ax = fig.add_subplot(111) #添加subplot
0 ^. l V* b) L. w. a$ | - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本. s; k. \3 L+ @0 F; L
- ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
F* B7 o2 Q+ O6 J$ y' s - plt.title('DataSet') #绘制title
F0 \- q) U# f1 E4 a - plt.xlabel('x'); plt.ylabel('y') #绘制label. K, ~( {! r0 U- `6 b/ o+ d+ ?
- plt.show() #显示$ d h$ h1 c7 R ], s# T& q! m
3 a5 t# V( A/ O8 i* g# L\" H- if __name__ == '__main__':% m3 p3 j- v0 y; O: b* L\" I7 C
- plotDataSet()
: K* b\" ?$ s+ N/ G& A/ F7 l* ~
复制代码
" _9 \$ o5 k: R( Z
从上图可以看出数据的分布情况。假设Sigmoid函数的输入记为z,那么z=w0x0 + w1x1 + w2x2,即可将数据分割开。其中,x0为全是1的向量,x1为数据集的第一列数据,x2为数据集的第二列数据。另z=0,则0=w0 + w1x1 + w2x2。横坐标为x1,纵坐标为x2。这个方程未知的参数为w0,w1,w2,也就是我们需要求的回归系数(最优参数)。- import numpy as np- y3 f\" u H5 [
* J$ D) x\" e( X4 Z2 w\" u2 H- """
! l9 {) `\" p$ E3 `9 N r1 P - 函数说明:加载数据
% |+ B: k$ O1 |- `* R
$ U3 {: |7 r5 l. s8 V- Parameters:6 M2 W* f7 ?) t/ x; A: s
- 无
6 ~3 Q: f# J+ V - Returns:% r' b' T' e1 D+ u2 ?( ?
- dataMat - 数据列表
9 |8 g5 ^6 m3 F( k3 Y/ I - labelMat - 标签列表
, o* E8 ~4 p$ Q\" J, l$ @4 k\" I9 m - """
' K; f! g4 s; \- b u$ y8 Z - def loadDataSet():7 t+ r$ [1 E, T& A2 g1 v
- dataMat = [] #创建数据列表
* R' A! x/ T\" r z# B; P* z. l - labelMat = [] #创建标签列表
$ }' h1 w, [. V! i - fr = open('testSet.txt') #打开文件 8 T3 d6 ?4 }( K- H: B
- for line in fr.readlines(): #逐行读取
5 C( H/ O: k7 R4 D% U- ~ - lineArr = line.strip().split() #去回车,放入列表! w; L8 g0 r+ }2 q2 p& _3 K& S\" u
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
' {& X9 l. E) @ O$ U - labelMat.append(int(lineArr[2])) #添加标签5 u1 B( g+ ?! ~, ^/ G+ Y+ C( P' e
- fr.close() #关闭文件
4 \# D9 f/ C. `8 _ k - return dataMat, labelMat #返回
2 d( c! M/ u X. @/ j5 y - H1 ^4 W$ ~: G o, h N
- """
4 o) [+ t. ^# z1 o: m - 函数说明:sigmoid函数
3 ]2 j( ]5 k, ?# O\" ~2 O - + v9 g! ~% @ R/ `8 g3 x' w
- Parameters:
4 k- P6 y, t& N0 C2 Q2 ?; l2 Y+ r: D - inX - 数据
3 A) M$ Z/ J7 z! V - Returns:
- A7 h, n7 v1 F' _0 n2 D - sigmoid函数+ Z4 |) B( Y! ?7 R% G. u4 Y
- """; ]# [ U& p9 I; @; L+ D+ G( y* Z
- def sigmoid(inX):( R: d& S# g\" i9 I
- return 1.0 / (1 + np.exp(-inX))% x2 \7 F* H# R, [6 V; R3 c
6 B- t5 ~) D- m( k9 ]
$ Q* v9 C7 T9 C g6 B0 w H- """
4 l* j9 z. g7 t0 |/ o( Q& y - 函数说明:梯度上升算法# N( y) a% I- r# [
9 y: P) x; ?! ^7 J; d$ z- Parameters:\" ]6 r& Q* B1 z/ B* l0 z* _
- dataMatIn - 数据集& `6 l; }0 `$ I6 z# d x( b4 ^
- classLabels - 数据标签
& h( x4 v6 b2 S - Returns:
5 f. ?( K% U- }$ r+ m0 @( e$ L - weights.getA() - 求得的权重数组(最优参数) a/ z/ ~ S. o8 r: ?$ \+ Y( E
- """\" @: n$ @8 z, ~\" g\" ~4 }' n0 b
- def gradAscent(dataMatIn, classLabels):
4 G9 o6 a7 j* p3 f1 O/ H - dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
( o+ D; x; Y% Z. w$ a- q- U - labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置% P, t/ }6 P3 B( w$ f# c0 m
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。\" Z5 V6 }' L' P8 U4 [3 c
- alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。& V) e& c/ F\" X9 u7 x* b
- maxCycles = 500 #最大迭代次数
! ^# q( |9 [7 q9 l\" b) x - weights = np.ones((n,1))/ Y! b\" n8 g6 c- B. V
- for k in range(maxCycles):8 |6 G! O3 r$ k( a1 V# ]! O
- h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式( n% W+ Z/ w# x1 m
- error = labelMat - h
% { g& v1 J' f' l5 E - weights = weights + alpha * dataMatrix.transpose() * error
$ }. o6 o7 B+ s( Q7 \4 E - return weights.getA() #将矩阵转换为数组,返回权重数组! J6 P. m; P9 x* D, _+ F1 [
& P/ c7 }+ h\" }; y0 w) t\" x& Q- if __name__ == '__main__':
1 w9 P; g$ I' M+ p9 j |! ?! Y\" Z - dataMat, labelMat = loadDataSet() ( {9 E& q8 y( }* e2 j- ^9 ~
- print(gradAscent(dataMat, labelMat))- h, l1 \2 u; O$ g5 E
复制代码 运行结果- [[ 4.12414349]$ [3 F$ d6 O4 H; b8 e
- [ 0.48007329]
\" ]1 } M O& [/ Q* v5 t& Z - [-0.6168482 ]]
- O: S: T- @. f% Y
复制代码
6 K0 [4 v- b1 C; {- E; w$ N8 g |
zan
|