- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """; p& S& {3 e3 N
- 函数说明:梯度上升算法测试函数! g# P& q8 G& `\" P
9 e- ^2 L7 |\" j, D/ G l% f- 求函数f(x) = -x^2 + 4x的极大值. {- J7 b' O1 e. O
, W, {8 _2 G, w3 V/ R/ P* T- U5 C- Parameters:, r( c# U# d$ d1 q# X1 J, l' y
- 无# X; I7 E; Q. a\" g% J! T# d
- Returns:1 u+ \+ \: h( \' Q, L1 |
- 无
M _% D; X1 B5 | - """5 G- i3 B, ]: v. {! j* |, e2 _
- def Gradient_Ascent_test():; P3 K( N4 K6 i$ _
- def f_prime(x_old): #f(x)的导数& B) ~9 u7 W7 r2 z) t' C% [
- return -2 * x_old + 4
& a- r7 V1 r% \: j# w. S - x_old = -1 #初始值,给一个小于x_new的值, n$ Q+ t8 y0 A# h! Q
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始0 t% E\" f1 d3 h* D( {+ o4 E
- alpha = 0.01 #步长,也就是学习速率,控制更新的幅度% ^\" M\" B1 b) D2 M \7 }6 R# |
- presision = 0.00000001 #精度,也就是更新阈值
$ K1 s1 d! j1 } - while abs(x_new - x_old) > presision:& y0 L6 @0 m. Z! y8 U/ A0 |
- x_old = x_new( h8 a0 k/ r6 X6 z5 H% Y
- x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
1 B2 ]' ?* x c; p8 ` - print(x_new) #打印最终求解的极值近似值
1 ]! k) F; T\" A - # @/ }' R2 a( S1 M
- if __name__ == '__main__':% ?+ X( H( C3 {9 p
- Gradient_Ascent_test()# M/ h9 h) ~0 o5 B4 _7 y7 z2 n
复制代码 运行实例:- 1.999999515279857
1 r J8 t: A% s. L2 R/ |
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0
% S8 q% x' H& E! Q - -1.395634 4.662541 1# Z, @\" S6 D$ R h; S8 d# @: K; |) P
- -0.752157 6.538620 0
6 q5 n1 T* g6 m2 t6 F K - -1.322371 7.152853 0
: F( N1 r$ H ?\" ~2 K0 H - 0.423363 11.054677 0
; p; |8 \& z, J* c0 K; Z - 0.406704 7.067335 1
+ o/ z D5 X! O1 ?0 Y - 0.667394 12.741452 04 J3 s9 T9 Q+ j1 F9 n$ m
- -2.460150 6.866805 1
, I- n' s* B$ [+ d7 k* k i; s - 0.569411 9.548755 0
9 T5 I, s4 `% A\" P$ z\" j4 W - -0.026632 10.427743 06 y) P4 k2 y: s9 q+ Z3 |
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt
& X7 [1 M& R) p4 s - import numpy as np
9 q' B3 T6 L& I3 E
0 c; o x. x/ c- """4 v5 T* \) ~7 b5 i. u+ f
- 函数说明:加载数据
! R. Y: `\" t1 N, C! K( C9 i- |! e
$ a0 ]9 L5 h9 N; u$ P- Parameters:7 P5 q$ S3 v; J
- 无$ r5 f7 y3 i5 w4 `$ A+ M. d
- Returns:8 u2 V$ `' J: N& a
- dataMat - 数据列表
, }/ y2 c* y$ f6 L( J( R - labelMat - 标签列表
- r3 N/ D, |6 p% ?' v2 |% h: v - """6 P# h) o! W* ~- ?
- def loadDataSet():
) g. U! n* [+ Z5 J. M, ?2 k - dataMat = [] #创建数据列表
( Q0 a+ r2 a' [- Z/ ]: E - labelMat = [] #创建标签列表
/ @6 U t2 w. K# N8 V - fr = open('testSet.txt') #打开文件 . a0 o/ j\" _ J
- for line in fr.readlines(): #逐行读取
: o) Y0 i& R7 F1 _ - lineArr = line.strip().split() #去回车,放入列表1 k5 R7 z5 [# u! R1 c# I- u/ M
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
1 U! A6 t' t- d: E - labelMat.append(int(lineArr[2])) #添加标签1 E; v9 L. |: f) b1 Q- Q; ]3 ?
- fr.close() #关闭文件. M e: x4 Y/ O$ `! E$ y4 Z5 ]
- return dataMat, labelMat #返回
# ~- w u1 A6 Y8 V) U - + {' B4 W. G0 G n- e+ B. Q& W
- """
4 R& ]; q7 A: J4 i9 F, Z0 ?2 d - 函数说明:绘制数据集
+ R/ O. B1 K8 n0 |: h8 I: G2 c - & C- C* n B, P0 Y; X/ \2 N, P
- Parameters:+ \0 W/ w; F. x) \
- 无: W% p$ a4 m; j k4 V
- Returns:
3 ]% ~) I, y/ a) n0 g - 无
: A' i W+ A/ c - """- j S$ Q+ h; ^! ?8 o* l# Z! k
- def plotDataSet():
% s* X/ D$ I* J4 e& y, T - dataMat, labelMat = loadDataSet() #加载数据集
, x1 b* }( Z\" O% L) c; J - dataArr = np.array(dataMat) #转换成numpy的array数组% {0 W( z& F- x# A\" }* _) x/ e9 g
- n = np.shape(dataMat)[0] #数据个数
S& J% @* k6 b1 d - xcord1 = []; ycord1 = [] #正样本! O/ }. |, e$ t
- xcord2 = []; ycord2 = [] #负样本' o! {# k$ X, ]( v8 [) }* {+ ]
- for i in range(n): #根据数据集标签进行分类/ V4 g9 n6 r- g
- if int(labelMat[i]) == 1:) |7 ^! X' ?. f: I
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
7 T/ r: j' @8 r: B6 J# \ - else:
* f5 ^. c0 g! g - xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本
. Y7 W4 o7 o, `, G/ O$ S% w; ` - fig = plt.figure()$ P- I7 e: v# @: H, p7 p9 k0 \
- ax = fig.add_subplot(111) #添加subplot
) f- F- B' L8 l7 A - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
) E9 `1 ^/ Q- C4 [ - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本% C\" Y2 e. Q F5 V& N
- plt.title('DataSet') #绘制title! H& W0 q @, d3 Q
- plt.xlabel('x'); plt.ylabel('y') #绘制label
9 c) B4 z- |* a9 ] - plt.show() #显示
( A/ c# w& K! ]) I. K- _: o! c2 \ - 5 R7 M+ q/ r p! E8 | {6 h
- if __name__ == '__main__':
# V5 A0 c4 E( m9 U - plotDataSet()
8 ^5 e+ K8 `3 v: J0 \
复制代码
) S0 ]6 O4 C4 Z$ i) b从上图可以看出数据的分布情况。假设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) X( ?) R2 e4 B- [
- ) v) z c' D* ?7 v5 w& f
- """: v' a+ d! n# B
- 函数说明:加载数据
# g) x; Z: C% T o5 ~3 [
3 E3 E( \) X7 _0 j7 \- Parameters:* P\" C6 \4 T) s% b
- 无
. d- a R' U\" J, g1 T - Returns:$ t1 L' j$ L9 j3 I. K( {5 b
- dataMat - 数据列表 ?& C! j8 d* S/ e7 D$ Q
- labelMat - 标签列表
3 I# U0 S/ u( U% s, F - """
0 R) B |* s) W/ | - def loadDataSet():\" e4 t1 |8 Q8 [/ z- d
- dataMat = [] #创建数据列表
1 o& y5 \6 j; u5 N - labelMat = [] #创建标签列表
5 @' l+ L% G! ]7 J7 ]- g( |/ ^0 P - fr = open('testSet.txt') #打开文件
6 k0 D$ N, I\" P+ }7 C: D6 g\" W - for line in fr.readlines(): #逐行读取/ k) C0 U' d: H\" d5 R0 |& ]
- lineArr = line.strip().split() #去回车,放入列表
6 e! t- Q1 M$ U$ B( T' ?& t/ p - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
, ?) ~5 G! q% d! Y* v+ U - labelMat.append(int(lineArr[2])) #添加标签
/ V( [/ c\" o7 {! g0 x* S3 @* a - fr.close() #关闭文件( d5 w! J( O1 _
- return dataMat, labelMat #返回
0 \$ J* K! t* A- V8 }$ ?. m
+ M! C- ]. \& u- """! ^, ^& A1 M4 m\" U4 H& k/ ^
- 函数说明:sigmoid函数0 p/ x- ~& F9 }\" x& E7 y6 N
\" `+ x+ z, D+ T7 [8 W- Parameters:
. K2 w9 v/ a4 [4 N9 Y7 ]& ] - inX - 数据% k3 ^7 b( ]& H4 O$ {
- Returns:
8 J @* ]! { e2 \+ A - sigmoid函数
, q9 f% y A. d% X7 ^- X - """+ P' ]8 J( x% g
- def sigmoid(inX):: p2 s; x0 [\" y
- return 1.0 / (1 + np.exp(-inX))
1 U x4 o\" d- Y# u6 S - + n6 P7 S' ?, _- u& r* A
- 8 _6 H9 B& ~: I. [& k\" W+ v
- """
& o/ H; E) O0 O! \& E2 O, Y& U - 函数说明:梯度上升算法
( g) B( o0 ?, m- t. {) i - 7 L; I5 H, o& q, I0 r1 u
- Parameters:
+ n8 K/ O; ?- X. {9 ^ - dataMatIn - 数据集
$ |6 T1 t5 `/ ]$ { - classLabels - 数据标签
r\" w1 s& x8 y - Returns:6 I/ o! F- r' x/ C- A# V( ~% v8 {
- weights.getA() - 求得的权重数组(最优参数)+ o* l& U1 e( Y0 I
- """7 F q5 o3 C# D# l\" W
- def gradAscent(dataMatIn, classLabels):) j( i4 V b, ~) ^
- dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
2 c6 d' p, p1 A1 s' ]* p - labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置7 K: [! p1 B$ B& h/ ]. |5 x/ _
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
2 i* }7 p2 w0 F% y, V/ w - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。, c; F% O# D, t' i! V
- maxCycles = 500 #最大迭代次数
4 u\" n, s1 P1 K% w% J0 f/ u/ B - weights = np.ones((n,1))
5 K% y0 e6 X+ S4 p4 H. Y& f - for k in range(maxCycles):2 M1 z( ~7 B% e4 g; Q2 s+ j* i% _
- h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式7 ]' l8 ^: p S5 _. s
- error = labelMat - h5 X$ n3 f o' N
- weights = weights + alpha * dataMatrix.transpose() * error8 a\" z `$ N7 ?6 l5 t
- return weights.getA() #将矩阵转换为数组,返回权重数组% L6 d8 h! h' M
\" f# e: A\" r0 H- if __name__ == '__main__':5 B. S9 }8 m4 n; x
- dataMat, labelMat = loadDataSet()
6 i D3 G- V% ]% X% D* y* M - print(gradAscent(dataMat, labelMat))2 L& J6 Q! M2 u7 ]. T
复制代码 运行结果- [[ 4.12414349]
Z2 O3 ?: Q( b& z - [ 0.48007329] q, c P1 _0 X# J5 @
- [-0.6168482 ]]1 ^- ^9 c2 C7 b# m$ H# e- F% D
复制代码
2 D; {; z1 h" [5 ?- J |
zan
|