- 在线时间
- 478 小时
- 最后登录
- 2026-4-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7788 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """) @8 b0 j: b. }0 H& |
- 函数说明:梯度上升算法测试函数8 Q. C- Y f- X4 f4 d\" K5 t
% K1 i! c. C0 t1 _- 求函数f(x) = -x^2 + 4x的极大值
* v) X5 z$ J0 e. C
& i `3 G0 W P! Z% q- Parameters:( {% |3 b/ o. N9 i& g
- 无
, p. c( e3 e4 I' B# M\" F - Returns:- T/ W0 b, ]. x$ v
- 无8 Z& u+ y) o. e1 _* a3 `
- """
- c8 A4 X8 }, X8 `* X - def Gradient_Ascent_test():
( c/ X$ y: p) e! { - def f_prime(x_old): #f(x)的导数8 ^' ~. s4 s- W0 d7 H3 P% E! Q
- return -2 * x_old + 4
* Z\" R9 H* R6 J/ I% Y( [+ u - x_old = -1 #初始值,给一个小于x_new的值
6 E. J\" o: U5 N4 e& l* c - x_new = 0 #梯度上升算法初始值,即从(0,0)开始
* b6 k5 _1 K* d7 ~2 z - alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
9 @, S$ N( d' e7 p$ V% C* ?3 Q - presision = 0.00000001 #精度,也就是更新阈值 c4 p1 R3 n3 n
- while abs(x_new - x_old) > presision:
4 M2 Q\" k; q\" b. g0 P - x_old = x_new
7 I0 Y5 j1 j) b5 p' W - x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
! e* d. ~: \; g$ ^8 `/ U/ I - print(x_new) #打印最终求解的极值近似值
: R5 j/ Y( _8 K$ x- z
- ~5 [7 _8 S: F7 `: I3 [1 S+ i+ S' Z7 ~- if __name__ == '__main__':' ~0 @% B9 a( F, z/ j: t
- Gradient_Ascent_test()
9 z) J: ?5 {* ]% }' t
复制代码 运行实例:- 1.999999515279857& q9 B* p8 n. {5 b- j8 |5 @
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0. j, H( Y2 s/ B
- -1.395634 4.662541 1
^9 Y7 X; i. M7 B) _ - -0.752157 6.538620 0
- Q- k* e& l! Y) n - -1.322371 7.152853 0\" g+ a9 u( g! _- o3 u6 l
- 0.423363 11.054677 0
+ \2 g1 q+ I$ Q+ ^5 m$ z4 F - 0.406704 7.067335 1; v8 l1 e\" V( `; T. [
- 0.667394 12.741452 0
- x7 w; j! c, p1 c _: f; ^0 w0 _ - -2.460150 6.866805 1
' z8 c5 U! s9 U. W! e - 0.569411 9.548755 0
, w8 k\" i; |) @; p/ t5 W& ~' y( s - -0.026632 10.427743 0
e- n9 D0 V0 j. z8 `6 E5 Q
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt0 V: Q9 s2 K; i$ X
- import numpy as np
, O3 K+ X$ A5 T) R - $ ~3 }% ?9 M4 }& ?. z
- """
& T! x e( T1 ?9 N) n/ @* u) k4 E - 函数说明:加载数据
. C$ e+ o- B4 Q6 m2 D - ! E3 ~; Q9 Q. n7 i# F1 j
- Parameters:9 b; X+ K# \\" a9 B( y. n& H\" Y9 n
- 无
' b4 t\" o* s9 l! M* V- s! N - Returns:
2 W0 ?5 `# ]* G4 D - dataMat - 数据列表* W5 c3 b, W5 G; }7 W7 t
- labelMat - 标签列表, I- F6 i8 ?' F' m' K+ a1 Q8 I
- """% h# O1 B: ]! m: g
- def loadDataSet():+ {$ D9 A& b, I- \( C0 i/ O
- dataMat = [] #创建数据列表% e% J( {9 c4 E; ^6 ?8 X
- labelMat = [] #创建标签列表2 L4 Q8 J. o, C$ T6 D6 I' I\" r
- fr = open('testSet.txt') #打开文件 9 Y) H' G% y& ]6 \\" K\" S, j s
- for line in fr.readlines(): #逐行读取7 A: O6 R! n* b9 F5 B* G\" d# R
- lineArr = line.strip().split() #去回车,放入列表
* Q5 i4 V7 z+ b* V4 c - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
6 Z6 u/ P8 m( v i/ a$ O+ h3 v - labelMat.append(int(lineArr[2])) #添加标签
. f# m8 T/ S: {/ [: C, P) K3 B R - fr.close() #关闭文件) E% U1 C/ h1 T, L. v4 C* s1 q8 e
- return dataMat, labelMat #返回
7 _+ \8 E( W; ~; j1 J\" v L9 `5 s$ i - , Y, f f; c4 l1 p
- """
, U- z\" O8 n- M - 函数说明:绘制数据集0 k7 S. t3 e, e- B# V$ B2 V/ N& \' g
# R( H* [8 \+ Q% p# ]; ~9 @ h8 ^- Parameters:
\" ?6 M8 G$ u- E - 无
8 L; D* F8 L\" E4 a0 v' y - Returns:
1 B6 Y; r' g( u; z+ |7 I - 无
. u3 R6 M2 M. }* Z; U - """
7 p7 A8 X) {+ @& ] - def plotDataSet():5 [2 R5 |/ b( ~% U- N: L
- dataMat, labelMat = loadDataSet() #加载数据集
: J; s; m4 N1 r - dataArr = np.array(dataMat) #转换成numpy的array数组' K2 S/ u. H1 \$ A* D
- n = np.shape(dataMat)[0] #数据个数
9 E% ]4 H% [\" G - xcord1 = []; ycord1 = [] #正样本% } u! U e\" `! l
- xcord2 = []; ycord2 = [] #负样本
! `- S) v1 X7 X - for i in range(n): #根据数据集标签进行分类
! e- N9 Z: |$ N\" y9 f6 J- p - if int(labelMat[i]) == 1:4 r9 J, d0 ^7 P
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
0 X7 N) k0 N1 C - else:2 z& W2 H% i5 b: k. E
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本0 g' D. E7 H$ q2 e9 w! R
- fig = plt.figure()
* X8 e& y; M ~3 [ - ax = fig.add_subplot(111) #添加subplot& P: I, [- e0 ~7 P( t: f
- ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本+ j; u: ?* H# S
- ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本) n+ ?, Y\" _7 t9 T+ {
- plt.title('DataSet') #绘制title
& k8 c: o( W+ v# S2 m& J - plt.xlabel('x'); plt.ylabel('y') #绘制label1 U* i6 C# F0 M: ~9 |7 o* I
- plt.show() #显示
( Y4 V\" F* x5 q4 _( X/ Y - 6 @4 W; h7 j9 _8 b' w8 v: K4 ~
- if __name__ == '__main__':
: R* ~8 k5 A9 n3 c: ~. w+ j0 _' f - plotDataSet()
\" N, z8 ^5 h9 X% ~# ]
复制代码
7 `9 t6 ?' n/ |* ?从上图可以看出数据的分布情况。假设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
) c0 N0 i9 u# }, e# h - 4 h3 p0 ]' r3 N( U
- """
; U6 o: G2 V4 \/ z1 G) L - 函数说明:加载数据
8 b8 e- f) B\" j2 b8 ? F - 2 |) }+ M' F' U1 y# U
- Parameters:) H4 D& x ^3 p* p9 G7 l8 |
- 无0 U N' y) G, \% \0 q+ T
- Returns:; y, ^% l. E8 r! H2 p) Y5 @
- dataMat - 数据列表
5 w- ]3 u\" Q. W/ ` - labelMat - 标签列表
\" e$ Z( F/ f' L( {2 N - """$ @3 x0 h4 E( a+ q
- def loadDataSet():0 X3 `# ]\" ^+ v8 Y
- dataMat = [] #创建数据列表
* g- Z1 P( v+ q9 |5 ?; g0 `8 }: T; i - labelMat = [] #创建标签列表% _3 {! s. y- E; J\" N
- fr = open('testSet.txt') #打开文件
$ n# Y/ H2 d( [3 N, L: c - for line in fr.readlines(): #逐行读取
5 K/ F& F7 ~; ~$ p7 g - lineArr = line.strip().split() #去回车,放入列表
0 P$ L5 p# [/ i% N - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据9 {5 j8 ]* Z5 M: d1 a
- labelMat.append(int(lineArr[2])) #添加标签* j x/ P* ?/ B: ^; Q
- fr.close() #关闭文件\" G B0 a8 u1 _) t6 ~* Z$ f\" I
- return dataMat, labelMat #返回* ^' G\" k: P/ ~6 [, f; X
; I/ ]2 T% w: p- """8 ~* z( A6 |8 A# k- Z
- 函数说明:sigmoid函数6 ?( X5 E9 g$ W
0 ` [; _) v: { e: s( V i- Parameters:
* G! j: z: w3 @0 |3 m' g: R( w- L - inX - 数据6 L4 d2 F/ w8 ~4 T( z\" F# E) U$ x6 i
- Returns:
9 N0 A% z/ A6 z. ~: Z4 c/ V* c3 x - sigmoid函数
- }- i) j& t4 s0 _7 b* D' A - """
0 c* v8 c3 [; D/ R! A4 U% e - def sigmoid(inX):
: r\" m6 m( d6 l - return 1.0 / (1 + np.exp(-inX))
; w, ?0 k+ n# x6 R, F
; H( F& \, X7 ^, h1 f- 0 ?: R' q7 J8 Q0 O+ I
- """, Q& J. N9 P0 ]3 v; l; Q% o4 w
- 函数说明:梯度上升算法
; A6 b0 g) W; C# f6 u5 S5 Q - - L: H0 U' R% f
- Parameters:
: h0 v' ^: i0 ^$ V - dataMatIn - 数据集+ @7 B! f3 M# \: s7 I5 X
- classLabels - 数据标签
; ]; T& |! U# M1 y9 G }& f' l - Returns:; h$ n# ^/ O/ w+ i3 k3 c8 ]
- weights.getA() - 求得的权重数组(最优参数)& [) \1 w6 h1 M8 Q) j5 z D
- """
2 C3 e+ Q) d. A# K - def gradAscent(dataMatIn, classLabels):
3 Q1 n2 S- C) a9 [5 l; p - dataMatrix = np.mat(dataMatIn) #转换成numpy的mat1 C% d. q3 i @$ _. ?; M
- labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置\" R# I/ C\" ~5 A/ o/ R
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
; [% ?! _4 F; Z+ Y9 Y ]& \6 j4 j0 o - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。
! @& T- B$ [6 ~+ \, c; b3 C; e - maxCycles = 500 #最大迭代次数
0 N0 J* Q! Y% D6 K1 X - weights = np.ones((n,1))4 Z% E) I! t& x2 F; `0 C
- for k in range(maxCycles):
8 P6 S5 U+ y: \: d% P' M8 Z+ Q - h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式 T% i3 T\" U5 A$ y
- error = labelMat - h) _- i% v8 M% y, X
- weights = weights + alpha * dataMatrix.transpose() * error# [- @+ K: d9 V2 B$ c, S% F
- return weights.getA() #将矩阵转换为数组,返回权重数组
# U8 Z5 U# m ~/ {- k8 [& H, H4 y - ) Z3 }: Z, o) w
- if __name__ == '__main__':
2 o. ~\" c% j& _ - dataMat, labelMat = loadDataSet() & J* A0 _; L$ h8 q2 R( h
- print(gradAscent(dataMat, labelMat))6 H4 C, P9 d+ x1 y! a0 T3 R
复制代码 运行结果- [[ 4.12414349]# B- G8 ` z, t* f* |- I; Z6 |1 X+ B
- [ 0.48007329]
( r- p% U/ ?' H1 N% o$ l, g - [-0.6168482 ]]7 o. c5 W4 k4 R+ ]$ M9 w
复制代码 ( l9 U, c& }* E; G0 J$ P& p5 c
|
zan
|