- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """\" ^, M: M& m; m
- 函数说明:梯度上升算法测试函数
# b3 q# G\" D: U j - ! F0 N% f; O! h% ^
- 求函数f(x) = -x^2 + 4x的极大值. P& n* d! y% I* _6 s2 `7 ]% H
- % E8 u* U' K( s
- Parameters:4 S9 R& o+ D# _# H% ~
- 无\" q/ _. O! e+ D/ F) k
- Returns:
6 w$ v% r* [9 q G% S% {, p: h% Q. I - 无
4 M z. t3 S% m\" [ - """
7 u# ?' O- @+ C( K. j& e\" J$ A - def Gradient_Ascent_test():\" }4 Z/ c& m1 g/ c* P0 \
- def f_prime(x_old): #f(x)的导数0 B. A) K; L! T( Y! V6 p
- return -2 * x_old + 4* \% W4 f! }! J, r, k. Q
- x_old = -1 #初始值,给一个小于x_new的值
; L9 A$ \, l+ ] N - x_new = 0 #梯度上升算法初始值,即从(0,0)开始
3 r& R+ M- u2 E% p4 p* e - alpha = 0.01 #步长,也就是学习速率,控制更新的幅度2 N/ Q1 ?. k; M0 a, E' L
- presision = 0.00000001 #精度,也就是更新阈值4 l, F; e8 m1 b. ]7 u G: S8 z
- while abs(x_new - x_old) > presision:
2 s- I7 f1 _8 z0 | - x_old = x_new
( [2 A( [7 w. u8 b - x_new = x_old + alpha * f_prime(x_old) #上面提到的公式# C( N1 e$ R% X3 i
- print(x_new) #打印最终求解的极值近似值
+ F6 E% \5 r& p: q - 4 t$ r6 W. H5 O2 E. G\" @+ q
- if __name__ == '__main__':: Y' q. G- q* Z5 c; Y5 w
- Gradient_Ascent_test()
+ j T$ a5 N1 l, w
复制代码 运行实例:- 1.999999515279857( n! \9 T. E% e5 D) e# \6 }, o; ?
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0
- t\" w H3 {8 @! }* I6 I - -1.395634 4.662541 1
4 O+ G2 Z r! F( l - -0.752157 6.538620 05 H( n% ~; Q) }1 J2 d
- -1.322371 7.152853 0( y3 X' \2 V. F\" ]
- 0.423363 11.054677 0* K: e: u: Z) G/ y0 H- H7 k; ~
- 0.406704 7.067335 1
% {) u, z& C( H; H1 r2 V0 K - 0.667394 12.741452 0; {* S8 \0 I- f7 I8 p1 p; V
- -2.460150 6.866805 1
/ J. e8 S! e) X0 e - 0.569411 9.548755 0: c2 g\" }6 x4 y0 \9 a: C4 n
- -0.026632 10.427743 0- i8 K, q- q6 J x4 l
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt\" J: D+ M5 U3 Y% h6 a9 _
- import numpy as np
\" p$ W$ @& S- t, e' Z - , _+ c/ F5 D0 [1 ]3 [% l, r
- """
) |( S7 \6 v* s9 D; M+ F% J7 I - 函数说明:加载数据
' m$ W* `, M/ ^: O) m( ?6 D0 ?1 m - 4 P6 E0 a) F6 f4 B4 K
- Parameters:
+ E/ ?0 n/ c) M$ s% t - 无
' L8 M8 e( b) ^ i2 d, }. u - Returns:
1 Q' A0 h8 ?$ _. s$ x* V7 c - dataMat - 数据列表! B M, Z$ Y# W- J9 r
- labelMat - 标签列表
, H; v4 ^$ }6 q+ ~% V6 N/ I - """5 t$ ~; r' u7 T4 e; @
- def loadDataSet():: o& a\" h, h) P6 g+ r
- dataMat = [] #创建数据列表
# Q- e* i9 }/ Y8 t/ U - labelMat = [] #创建标签列表\" x8 T# z/ v3 I4 z+ e, l9 y
- fr = open('testSet.txt') #打开文件
$ A9 R- O6 q6 j( e) C; ~- }8 {( v' a - for line in fr.readlines(): #逐行读取& Y& h4 \: @- R i6 m' W
- lineArr = line.strip().split() #去回车,放入列表$ h& i/ m- F0 u! A$ y5 E
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
1 ]# ~6 }) v6 J$ v# [2 [9 ?. \ - labelMat.append(int(lineArr[2])) #添加标签
, }8 R7 M5 B. s$ r! H1 q - fr.close() #关闭文件9 I2 s3 ^) C+ {& M+ Q
- return dataMat, labelMat #返回
; F' K, Z) @' Y4 d: }0 U- _
3 _# q R& L, I3 }3 G1 C, z4 M- """
4 b: m) d: _, u: N) e( E - 函数说明:绘制数据集 t6 ?, Q- S- v+ _3 K
$ E: U+ p! Q. G$ m- Parameters:
6 N9 `' ~3 q- Y+ @% j - 无
: l0 D$ a; `( H - Returns:
- D; c2 ]5 P) u8 p9 Z' t7 t - 无, J( Y9 R* _; V8 N
- """
' t& Y) d6 q, z. B - def plotDataSet():7 u+ u) s m8 r7 }9 |
- dataMat, labelMat = loadDataSet() #加载数据集& @5 V# B a6 b4 E\" p\" ]5 U
- dataArr = np.array(dataMat) #转换成numpy的array数组
+ ]% R: H% n$ p; v4 C\" a - n = np.shape(dataMat)[0] #数据个数
, x* [4 o* z) L9 V0 h2 }\" v - xcord1 = []; ycord1 = [] #正样本
& z, [4 E, O6 L1 H0 c0 S - xcord2 = []; ycord2 = [] #负样本& C\" |/ e; T- R, P0 e Q- B8 {; i0 _
- for i in range(n): #根据数据集标签进行分类
\" S' ~5 z6 X% c( \4 o- x' P! L Q - if int(labelMat[i]) == 1:
6 C, R( \2 c7 ~4 g& W# \\" U - xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本* C; g( N7 l7 y: B+ Q& M, C' W' ^
- else:; E, A$ p8 l+ O% d
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本
# C! o6 ?/ i' n4 } - fig = plt.figure()4 `! P9 T5 C' w\" K0 G
- ax = fig.add_subplot(111) #添加subplot% [, t2 }% l7 f
- ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本5 d& l/ f) D' }/ j2 e) P% y k
- ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
3 l7 D. o$ W. r7 \& N7 [9 k - plt.title('DataSet') #绘制title
+ | m2 O D6 K3 g - plt.xlabel('x'); plt.ylabel('y') #绘制label9 n2 t/ z5 @; Y# k; k3 K' @; {
- plt.show() #显示/ M; @$ P) T9 s$ ]0 }' l1 N1 v
$ D) c* J6 j3 H D+ B) Q Y+ \4 u: o- if __name__ == '__main__':5 O* j8 C# X Y- W: F- `, u
- plotDataSet()' m0 i4 f/ R8 S# g- U
复制代码
* L2 ] ^& \8 C' X/ v+ ?+ Z" m从上图可以看出数据的分布情况。假设Sigmoid函数的输入记为z,那么z=w0x0 + w1x1 + w2x2,即可将数据分割开。其中,x0为全是1的向量,x1为数据集的第一列数据,x2为数据集的第二列数据。另z=0,则0=w0 + w1x1 + w2x2。横坐标为x1,纵坐标为x2。这个方程未知的参数为w0,w1,w2,也就是我们需要求的回归系数(最优参数)。- import numpy as np0 C8 m7 f1 ]/ ]' Q
- & w N9 f6 o6 k, l) `\" g) G/ F
- """+ a0 h: S% N2 B
- 函数说明:加载数据4 |4 F( h9 U: O& D1 a4 B2 o
- ) `5 h5 O+ f; a
- Parameters:9 I$ K0 A\" q. s\" O
- 无
; l0 `- v2 \8 o1 Q; f- X. E: |\" T - Returns:5 K& k9 |& ^\" A8 b% J
- dataMat - 数据列表3 p% h: z$ d6 _, |1 V4 `
- labelMat - 标签列表! v( ]* D9 c* [7 S: ?9 b
- """
9 K# M( H8 H6 R, h1 x - def loadDataSet():/ @' u7 x2 k1 U
- dataMat = [] #创建数据列表
7 I+ d8 M, W8 S2 I5 a- m! ] - labelMat = [] #创建标签列表* m7 d- i4 G% v8 I5 n4 h
- fr = open('testSet.txt') #打开文件 1 p! y5 B; K9 [8 @6 B
- for line in fr.readlines(): #逐行读取# |- o8 M3 Y- ^/ I% A# \* D# C/ @, A
- lineArr = line.strip().split() #去回车,放入列表$ @( h6 x/ o% I/ Q( w5 p
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
( P. H3 ?( U- V# g. T5 ` - labelMat.append(int(lineArr[2])) #添加标签% D, F- M3 u/ @, }/ A\" G
- fr.close() #关闭文件
7 w% ~( ^5 U\" C9 P! X! Z7 y - return dataMat, labelMat #返回
. K, G# |% i3 `9 f\" I; u
! L* G( F' G( V. b- """3 E6 U3 }5 T/ o) m0 f& ~. Q. _
- 函数说明:sigmoid函数$ s' Q3 W/ S m
! w+ ]) {7 P\" {+ d6 ~6 V- Parameters:* w7 F1 j4 Z: ]- Q( ?\" @6 B `% E) }
- inX - 数据
( x' Q; c* g0 M5 \7 W! X/ B* z. C, N - Returns:
) w; t+ G; K5 F6 M - sigmoid函数. r+ ~( ]/ X7 j0 C- g
- """
$ B2 S- n2 _$ a0 t r* W\" `- S - def sigmoid(inX):
/ H3 h! d\" y* n2 @! N. U; R. W - return 1.0 / (1 + np.exp(-inX))- N! f1 \; Q) s! l6 ^: U
7 N! O$ a6 o6 X* \- G3 s/ o0 Z) U& h
- """
j D2 y+ J# n* |3 M - 函数说明:梯度上升算法
, c, q* P% B/ v: d\" d% `) D - 2 S Z+ {! J P3 ^/ _+ s
- Parameters:6 y% X$ ?) X6 B; G( C+ x( C/ z
- dataMatIn - 数据集
! j7 B& g& s1 _+ r - classLabels - 数据标签7 F: j* p# l, Y
- Returns:
% O0 }( Q) k\" U+ A) _\" S0 q - weights.getA() - 求得的权重数组(最优参数)- J, W# r, D j) G* d, t. b
- """\" t: f V+ ~, J* m
- def gradAscent(dataMatIn, classLabels):
) q& x; y5 v$ Y% z - dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
( G: w8 N5 j8 v( b# o; C8 B; ^ - labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置
. U9 P: n1 d N1 Q: s. y - m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
4 _ Y' j% t) i% g - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。2 {/ p$ t* F$ p% {
- maxCycles = 500 #最大迭代次数
8 ~ E5 o8 V E! Y% Y) X5 X9 ~ - weights = np.ones((n,1))
: ^7 q D1 M( }% Z - for k in range(maxCycles):
6 d2 J$ R( o8 l' T$ ~5 q+ x. `& e/ P% C - h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式
! j0 @\" E/ p1 w3 S+ {* y\" i - error = labelMat - h
- s7 k8 A( Q v6 e5 T, B - weights = weights + alpha * dataMatrix.transpose() * error
9 z o* \\" y+ C6 z2 [* \ - return weights.getA() #将矩阵转换为数组,返回权重数组! h4 e: ]! d8 M5 i' b8 e# Y
- + Z7 @% x1 M) a& j2 L- L
- if __name__ == '__main__':
5 O* M0 z s( L3 [ - dataMat, labelMat = loadDataSet() \" x; E# w: q- I
- print(gradAscent(dataMat, labelMat))4 a: {: Q: H\" Y! l$ j: }$ i
复制代码 运行结果- [[ 4.12414349]! Y6 y! a& ]8 d6 o, z
- [ 0.48007329]9 [' f6 e, X& A: S
- [-0.6168482 ]]0 W5 q& o, w( r1 M
复制代码 ' s5 G! @% U$ ~$ A- I @7 t
|
zan
|