- 在线时间
- 482 小时
- 最后登录
- 2026-9-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7953 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2978
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1183
- 主题
- 1198
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """
2 G/ \- \+ L7 X\" }. u2 } - 函数说明:梯度上升算法测试函数* k; `9 v: U H: U5 \: M
- ' X9 f* N% y. x) u8 n& I' P3 E
- 求函数f(x) = -x^2 + 4x的极大值& T0 Z% C' Y, N1 d2 h
- # k& p6 ]) v' P8 a: c8 W/ V
- Parameters:
7 t6 _. P* F4 }3 ^) k - 无
1 o- @6 F8 A$ z: u% ] - Returns:
, w; Q* M) D5 U\" U1 I - 无
4 i: y- d; T+ D\" X - """
' }2 Y, y4 f: X0 l\" u3 j) f, _: _ - def Gradient_Ascent_test():
. q/ ~9 X9 z1 [9 r0 r - def f_prime(x_old): #f(x)的导数8 L8 y6 b2 i. p( O$ Z0 X o
- return -2 * x_old + 46 N0 Y! T0 S2 o7 j
- x_old = -1 #初始值,给一个小于x_new的值; s, H! }; j W5 ]: }5 x! y
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始
. O& A. L\" S, r) ? - alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
1 d+ p$ j\" m! {' y/ i& q+ V; ]. C: T - presision = 0.00000001 #精度,也就是更新阈值
M9 w0 E9 X1 x* q - while abs(x_new - x_old) > presision:
: C9 S- |& |. {7 G7 w0 x+ P - x_old = x_new
1 I1 l5 K. Y\" F( n+ D. f m - x_new = x_old + alpha * f_prime(x_old) #上面提到的公式/ v6 S. |8 F6 }3 ?5 d- @/ p
- print(x_new) #打印最终求解的极值近似值
' T2 x3 b. \6 k; b0 I
4 e' ?# J* U: o% D- if __name__ == '__main__':
/ ~5 A\" M# n7 A* _2 Y ^: S% J8 r - Gradient_Ascent_test()7 i# H( C2 b. j, K0 ~
复制代码 运行实例:- 1.999999515279857
- h( b& F1 s5 U4 f! v; Z+ H, j4 t; n! u
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0
\* [/ t) I5 I - -1.395634 4.662541 1- J8 `( q: i' B- Y8 z
- -0.752157 6.538620 05 g' X* ?/ T8 o5 ?1 N# v
- -1.322371 7.152853 0
8 ~. ~ f5 h8 l$ d\" Q! D( s; t - 0.423363 11.054677 0. L( ^/ E( Z8 ^; Q* D' [
- 0.406704 7.067335 1
; o% D( f6 D I% M; h - 0.667394 12.741452 04 Q2 }4 j$ W1 m3 [: O
- -2.460150 6.866805 1\" [( F8 X; j# w4 A3 i$ }
- 0.569411 9.548755 0
( D6 a, ~) Y\" p: v/ X5 H - -0.026632 10.427743 08 Z' q9 R# w) q9 g) @
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt4 n2 I. z# D8 K+ }* F
- import numpy as np
\" |\" W/ y. B! _, F+ ^6 v. u/ T* U - : r' z% X0 n1 W
- """# i2 E8 G5 S4 U3 |2 ]
- 函数说明:加载数据
# x: j1 e8 n6 a6 T/ ]* A
) r6 t4 G# n0 P* w8 q# P3 u+ W1 _5 k% Q- Parameters:
) q6 J$ z r2 |2 m% O4 q: D - 无
% k\" Q% z* T/ @; X$ O/ p - Returns:
% Q9 n; R7 F\" b c- B& L _ - dataMat - 数据列表/ ?, S b# j2 K! Z
- labelMat - 标签列表0 R& K: p% J! A g4 O! A: @
- """
! d/ S3 X- p: r\" l3 L% y - def loadDataSet():6 S& L, S' a7 B8 M6 H\" t( r. ?
- dataMat = [] #创建数据列表
+ l( U; P1 `( u: E* P - labelMat = [] #创建标签列表
9 i+ X0 ^( w m3 {/ `0 M - fr = open('testSet.txt') #打开文件 % g1 x4 r- k, a3 j3 ^% a
- for line in fr.readlines(): #逐行读取2 C! [3 v9 O( V2 G
- lineArr = line.strip().split() #去回车,放入列表
9 Q; b% @' a7 M! R4 w7 o - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据( f/ e/ |, F$ ~7 t\" f
- labelMat.append(int(lineArr[2])) #添加标签
& H* t4 N& s$ y* f9 d! { - fr.close() #关闭文件
1 `- Q* _6 d0 u2 A/ V. L4 ~ - return dataMat, labelMat #返回
4 D. J; W4 Z5 r: }. l
1 M$ G. a# y* k; S8 H- """$ l1 \. O( O% F$ P, |0 Q: f z
- 函数说明:绘制数据集* A# D+ o8 X2 F8 [+ N
- % p3 H! G' A% X; O$ G& f. ]8 Y
- Parameters:
- j4 h- z7 S/ ] [ - 无. n9 W2 s/ l4 J |
- Returns:. r5 L3 m E/ o\" j\" u) j
- 无 B$ R7 O8 n% I, C1 e- g
- """
! ?) z6 d: q' M. {5 m - def plotDataSet():\" F( v6 y5 E5 A8 h- d
- dataMat, labelMat = loadDataSet() #加载数据集\" j& z) p C# W1 g
- dataArr = np.array(dataMat) #转换成numpy的array数组
- Y; _* {7 [7 q4 Z5 z' r - n = np.shape(dataMat)[0] #数据个数9 r; q' ^* v0 G
- xcord1 = []; ycord1 = [] #正样本
% W9 d, t/ E1 O3 N D - xcord2 = []; ycord2 = [] #负样本. C7 `+ V/ D1 }. i1 C' \
- for i in range(n): #根据数据集标签进行分类/ P( Z Y; \$ `4 m n& b
- if int(labelMat[i]) == 1:. x; r, o2 l; |2 {; v9 `
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
$ L4 `1 H/ Z6 g% u - else:
: o' U% T! R$ O) [# d) w3 H - xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本! }3 f) }7 o/ P6 t4 e) @) R\" F
- fig = plt.figure()
) f, J* T$ J& H# _ - ax = fig.add_subplot(111) #添加subplot+ y6 j* U7 _; E9 A* h/ k
- ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本$ l0 B0 X$ S8 q+ T) Y8 h
- ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
5 w% g4 X* G\" i2 z, z - plt.title('DataSet') #绘制title) s# C7 d+ T' F0 m
- plt.xlabel('x'); plt.ylabel('y') #绘制label
0 [$ ]: b# W2 W$ x - plt.show() #显示\" V# y6 H/ W* t/ j
- : A2 J3 i6 i3 c- _7 N
- if __name__ == '__main__':
! _9 n/ S# a4 x( O3 R - plotDataSet()
5 N3 `: ~+ S* B7 F9 v
复制代码
7 p- _ w+ z2 q& N9 M) a
从上图可以看出数据的分布情况。假设Sigmoid函数的输入记为z,那么z=w0x0 + w1x1 + w2x2,即可将数据分割开。其中,x0为全是1的向量,x1为数据集的第一列数据,x2为数据集的第二列数据。另z=0,则0=w0 + w1x1 + w2x2。横坐标为x1,纵坐标为x2。这个方程未知的参数为w0,w1,w2,也就是我们需要求的回归系数(最优参数)。- import numpy as np9 j, l1 G/ e$ l0 A- I }\" l# X, Q
- - G( t7 {3 C1 r, S
- """0 o% F9 J& ^ N, x5 }6 g, n) i
- 函数说明:加载数据
D! m; [0 J- o3 V5 B
d. k5 | Z# @! b8 @- Parameters:4 C. ~' H0 |/ R) @* S5 J
- 无
4 Y0 T6 I( k0 u - Returns:/ R\" r9 e2 H( J l% B; b( I9 Y6 p
- dataMat - 数据列表
# U. D- U1 \, E# q' Y& _ - labelMat - 标签列表
4 D9 S\" R+ F @+ l9 [# {, W% n% O - """
& t8 [7 l0 G: [\" ?\" P! n - def loadDataSet():
# X5 m6 h8 ]8 D2 j; m7 z+ c/ _7 c% x2 S - dataMat = [] #创建数据列表( F) H: A: @$ e
- labelMat = [] #创建标签列表4 P* X5 n# @/ b. u% ~6 h\" e
- fr = open('testSet.txt') #打开文件
' x& Z9 j) k3 ?$ j# h1 @6 P - for line in fr.readlines(): #逐行读取% e$ |5 ]+ k6 [- M$ o; Y' k
- lineArr = line.strip().split() #去回车,放入列表
7 `2 k# f\" J1 l; E - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
) ^2 u/ Y* a8 _* ~ i - labelMat.append(int(lineArr[2])) #添加标签7 V# ~0 D4 @5 C9 D
- fr.close() #关闭文件
6 E: p4 o3 o3 J. I4 ~* H - return dataMat, labelMat #返回
9 d6 a* m' X) n2 G( S, j- m
7 T4 ^$ S4 p0 q- Q- """
- t! a! j2 k) \6 k+ ` - 函数说明:sigmoid函数\" V& K5 P3 J v# E# E\" {8 j
4 t\" {, [. v1 l& p$ X# C$ ?- Parameters:6 S* v: s0 N W. f
- inX - 数据8 u! P1 J, t/ ?
- Returns:) f\" h* R/ l4 E, V/ b: \
- sigmoid函数, e4 j0 F$ h! }: w4 m5 d( t
- """
# c4 B+ ^- ~\" h - def sigmoid(inX):
: _ i( C1 H\" n9 H- r - return 1.0 / (1 + np.exp(-inX))
) T; `# B7 P- z3 R\" Y5 Y- S - 8 b\" P8 H5 H. C) X
- . h- N3 J. g y& Q\" e
- """- `5 O4 W C% z( n& P
- 函数说明:梯度上升算法
! |& J% G# m, w7 Y3 `
, e5 J F# v% ?. b/ M- t4 R- Parameters:+ \\" _! Y- }. I0 W7 K
- dataMatIn - 数据集) C+ Y3 ]0 U/ w$ N( j
- classLabels - 数据标签
! k( J! J% O+ h, W - Returns:
: X- d8 r\" r% D; K - weights.getA() - 求得的权重数组(最优参数)\" Y3 h) W: Q1 p' I( N l
- """0 N7 r5 F2 r# C: H* M: `
- def gradAscent(dataMatIn, classLabels):
k; R# E* U( j\" ~% \, c# S - dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
& s7 X0 b+ W6 t1 W! R5 B - labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置5 h. o/ h: I: P8 ]: H1 v. u
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。4 ]9 g+ k9 E\" K
- alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。
. j5 t, P: }& I% Q) ^) t: G) _! J1 B - maxCycles = 500 #最大迭代次数# ~8 `; X\" S& Z1 G N
- weights = np.ones((n,1))% `* Q6 I8 \$ u
- for k in range(maxCycles):
\" F' x0 _0 W5 T$ a+ [% b - h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式: L# @' A' k8 n( n( w
- error = labelMat - h; e/ o. [6 r' \- I ~! F; S8 I; }
- weights = weights + alpha * dataMatrix.transpose() * error2 h0 i2 i& p! ^3 z$ ?! K N
- return weights.getA() #将矩阵转换为数组,返回权重数组
6 Q* z8 [9 G% _ R1 q5 K( o - % Z8 i A* m8 p; m- i# }( `. d- A
- if __name__ == '__main__':- Q8 I( ` ?\" Z+ M# O
- dataMat, labelMat = loadDataSet()
6 }% o% a* N9 X4 M\" m* I. n9 h - print(gradAscent(dataMat, labelMat))$ O* a$ q5 {2 d: z- j
复制代码 运行结果- [[ 4.12414349]9 d. Q5 j+ A1 b0 G
- [ 0.48007329]
/ e( n, |$ m. K6 G, d\" G - [-0.6168482 ]]* z; K7 ?% T- X* l& i. R7 b
复制代码 5 ^& k" s! c, ]& L9 G- S
|
zan
|