- 在线时间
- 462 小时
- 最后登录
- 2025-4-26
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7236 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2749
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1156
- 主题
- 1171
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """$ J) {9 }9 I+ y; |& l
- 函数说明:梯度上升算法测试函数
0 O. _6 c/ G1 c: G - ( F\" U7 |$ v% Q
- 求函数f(x) = -x^2 + 4x的极大值
: |4 e9 r& ?( ]8 z: C! f3 w! q+ j - & L* G- }! J8 P- S
- Parameters: f) K- o& E0 F, L# w' }
- 无/ a7 ^; P: u+ u
- Returns:8 F/ C& u) u# S, N% x$ V; |* g+ N
- 无# v- o# x( [7 h7 e4 H0 A
- """
: `) ]0 t. S, s - def Gradient_Ascent_test():
5 \# Q8 T, F: h - def f_prime(x_old): #f(x)的导数; N5 K4 |8 G4 J1 n& w5 d
- return -2 * x_old + 4 K6 E% S1 O0 a
- x_old = -1 #初始值,给一个小于x_new的值
! ?( h+ a6 @3 V* `* Y) Z! Q9 z. ~ - x_new = 0 #梯度上升算法初始值,即从(0,0)开始
; Y/ z8 _5 F5 X3 m\" e - alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
7 H4 U9 A9 r: j$ \! [ - presision = 0.00000001 #精度,也就是更新阈值: B( H7 g7 @/ C$ P$ [
- while abs(x_new - x_old) > presision:
! N+ @& M0 k8 i4 w - x_old = x_new
. B; y' g4 y# \( k. w+ M - x_new = x_old + alpha * f_prime(x_old) #上面提到的公式8 m7 R4 o3 [ E6 {0 ~5 D4 @
- print(x_new) #打印最终求解的极值近似值( U9 [0 N' d. Q o' @, E8 o' W
% u( V8 I4 W! y. [) N! {- if __name__ == '__main__':+ |+ j4 M# B( n1 X
- Gradient_Ascent_test()# F9 n2 d/ t+ v: \9 |
复制代码 运行实例:- 1.999999515279857
; K\" G0 D+ s1 c- f$ [6 K
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0% p' _: L0 R1 x4 e5 D0 m3 U
- -1.395634 4.662541 11 O; n; l! R7 x [& o0 s
- -0.752157 6.538620 0\" [( o8 r1 J8 h% k8 ]. @
- -1.322371 7.152853 0% w! ~! w2 L n! b% j9 f
- 0.423363 11.054677 05 t' d- u% F- ]. E
- 0.406704 7.067335 1' U, Z) s- y6 ^8 y
- 0.667394 12.741452 0
5 F' t, V) X) J# M - -2.460150 6.866805 16 P# i+ @& L7 r6 o# K% i
- 0.569411 9.548755 0
* v* y5 @/ x% ] - -0.026632 10.427743 0
; i; _1 [# \+ R) |
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt
0 g% ^. `3 W' l% b - import numpy as np
6 R* g4 h. c\" q& w; D
h: {8 [. S) X3 ?( k- """
- r9 F) ~7 W4 d& O7 {\" o' b - 函数说明:加载数据
\" z% b# n( v! S0 y: O- v8 c - & b\" [$ h2 I0 ~1 C3 R- R
- Parameters:, R0 C! Q, ]9 ~- v& M) i
- 无
4 V: g. Y3 [) T; |, C - Returns:- c. R) s6 Z) Q8 z4 ^; ]5 Z
- dataMat - 数据列表! D& I. Q! b$ c( h% F8 A
- labelMat - 标签列表: H% G% K9 _+ x6 ~4 J) r
- """
) \; i, E3 ~2 r3 G - def loadDataSet():! c+ V+ S/ }+ S; |6 F
- dataMat = [] #创建数据列表
4 X5 h8 u4 Z3 X K3 e5 g* e& W - labelMat = [] #创建标签列表
5 G+ f4 T1 U, r, f7 V Y2 T - fr = open('testSet.txt') #打开文件
+ x% f! _# z& R& |; \3 ]: ^& X$ ]. ^ - for line in fr.readlines(): #逐行读取+ W. z. S6 r4 Q
- lineArr = line.strip().split() #去回车,放入列表
0 `+ h\" ^2 o3 F - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据* \/ E4 Z8 w: `; Y
- labelMat.append(int(lineArr[2])) #添加标签; a! I0 T. ?$ P7 j7 D8 @
- fr.close() #关闭文件
1 b! f9 e) p$ k: k: @ f) d5 u) P - return dataMat, labelMat #返回
8 e* |& x0 [3 u, M
2 z' e3 W; `% J- """
7 {7 j |8 V! W9 L3 ` - 函数说明:绘制数据集; o% t/ J4 P1 q9 Z$ ~8 i
- 5 j/ h6 W. j/ j: E u* M) D
- Parameters:
$ [2 }- k6 D! Q7 r - 无
0 M# `; X3 `2 |( E7 Y, T - Returns:8 ^/ c B: J* ?/ K8 C
- 无* Z! X3 L# S\" Z) K\" F
- """* W \ I+ [5 z1 S/ _\" R
- def plotDataSet():1 s: S- t; t2 @, A+ e+ n
- dataMat, labelMat = loadDataSet() #加载数据集
- e( h! I' n! O( ^6 s' P. t$ V) }7 j - dataArr = np.array(dataMat) #转换成numpy的array数组\" \# n# q2 o j1 h% J0 }# F0 |( ~3 E
- n = np.shape(dataMat)[0] #数据个数
: m o, U3 w4 M8 O - xcord1 = []; ycord1 = [] #正样本
) t8 t) E& N, Z3 }% E: X) u - xcord2 = []; ycord2 = [] #负样本
1 n. g. R* ^$ i - for i in range(n): #根据数据集标签进行分类
1 q+ ] [: ~/ z8 f3 b - if int(labelMat[i]) == 1:4 ], W1 n/ t/ n( i- C% W3 g
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本9 v$ z+ f6 i- X) o4 j5 b. V( q
- else:/ J, h& h( x- V6 O* X3 D- U5 C- _
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本, p' k+ g( a\" }
- fig = plt.figure()2 S m+ h; \1 {& p8 M8 I' ]
- ax = fig.add_subplot(111) #添加subplot
) d; t$ }$ j' o\" S - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
2 j# ~6 ^: \7 t1 S' f% S1 S2 Z4 u) U - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
; L( c f, ^9 P, e& ~ - plt.title('DataSet') #绘制title
& ]& B5 S& W4 k `( x - plt.xlabel('x'); plt.ylabel('y') #绘制label
3 j: y- t8 r: W7 ?8 h/ V: D+ C7 { - plt.show() #显示: z; O, ~4 ~. S2 U9 L; O6 x9 W2 g
6 Z; u: f/ {9 g2 }; Y4 b- if __name__ == '__main__':. L2 U9 Q( I5 b6 a; Y( ]5 N& o7 y
- plotDataSet()( {- D/ n$ x4 F; f/ _, f
复制代码
, f0 Y! ^: K: q4 ?* U; r从上图可以看出数据的分布情况。假设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
: V. T- i& F( A& ]7 f9 h
- y& Q) S% h$ E- H- """+ A9 k% r5 A ^$ T6 L7 v
- 函数说明:加载数据. U% K0 x' \* M q\" Z* W( `) k9 e0 u
- 8 o\" n0 Y0 \% N/ A( F5 u
- Parameters:
- F- v8 h% O3 _$ y - 无; [( h: f& l% D0 q
- Returns:$ l+ d* }4 V8 ]* H/ u
- dataMat - 数据列表; `! ?- I3 ^+ i) |
- labelMat - 标签列表
+ w6 V7 c4 s) y. F0 t; B - """8 @, r$ e M\" q/ {. k {
- def loadDataSet():
# V2 d/ V5 R! Z3 J - dataMat = [] #创建数据列表- k/ M; V6 x0 N
- labelMat = [] #创建标签列表
/ f9 G/ j2 J2 R - fr = open('testSet.txt') #打开文件 . X3 j\" s9 b) [) @1 ^# t; C
- for line in fr.readlines(): #逐行读取
* m0 X3 L9 b/ k& ?8 s. V - lineArr = line.strip().split() #去回车,放入列表
( m) k X9 M* \$ @7 c0 \0 B - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据 \6 N9 }5 ?( X4 g\" J% a
- labelMat.append(int(lineArr[2])) #添加标签7 R8 B$ l2 A. s
- fr.close() #关闭文件
. x9 D- X\" n9 n9 Y - return dataMat, labelMat #返回
, c+ L$ e8 X& T- G: ~
! ~1 `, i; u' z2 v2 v8 j1 @- """. s8 b; B/ O) N+ n
- 函数说明:sigmoid函数
9 d- W# P+ y4 y. ^1 |
, N: `0 ]/ ^1 _- K' ~- Parameters:0 Q1 a- I. A8 e( B
- inX - 数据
2 R* `* O\" E' u: m - Returns:: w- X4 A1 h9 x j\" E
- sigmoid函数9 e [0 D8 T; Y3 k: ] ~\" g' |
- """
1 C7 ^; l$ ^6 N, d - def sigmoid(inX):7 m/ l& W# ]% w: q3 b: D
- return 1.0 / (1 + np.exp(-inX))
( U+ D7 p4 v\" z, Y& d& G - ) ?' }* {8 z6 H7 ]4 f
- 4 ~9 l8 `: D. U: n4 u% u& O
- """
}6 u: l\" _- ?& _& h0 P2 J - 函数说明:梯度上升算法
- s1 S& [4 `* W) H' O% w0 e) _7 g - / k+ c* U3 M& z# h1 d+ }9 X
- Parameters:8 S. z1 A* F/ A
- dataMatIn - 数据集8 p9 J! W4 R. {4 u
- classLabels - 数据标签5 m- z& n6 c( y k1 T
- Returns:% F j9 V- e- L+ P\" v
- weights.getA() - 求得的权重数组(最优参数)/ N, G7 _/ x' p3 S
- """4 N, e: f$ i; J$ {
- def gradAscent(dataMatIn, classLabels):, x, B0 n5 H& z* V! F R
- dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
5 x5 C( a! B* b: O w# S, K - labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置3 t9 @6 M\" w+ P3 b$ B8 l
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
- ]1 |8 H1 v* o/ n - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。& z, i0 z7 K4 L. ~: k4 V
- maxCycles = 500 #最大迭代次数
6 s! V& q$ C7 l$ u( ] - weights = np.ones((n,1))
0 S* J5 V3 R& C/ L, M( s& ]8 J1 J; e- L - for k in range(maxCycles):
U5 ~+ V5 h7 `6 u. ^! j - h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式
4 |5 `- z5 P, B# w( N$ g( S - error = labelMat - h
/ L/ G5 d9 J n1 E\" K! u# B - weights = weights + alpha * dataMatrix.transpose() * error
7 C& }: k* p1 a* {7 u - return weights.getA() #将矩阵转换为数组,返回权重数组
& e! X) k) s$ d% e
: E2 d: ~' q\" y0 c5 Y# i- if __name__ == '__main__':
2 w' @' b( U. B) R. k, r: p4 i* Z7 I - dataMat, labelMat = loadDataSet() + Y' }; U$ N% O y$ Q- i
- print(gradAscent(dataMat, labelMat))
. g2 {( |9 q; {! F: g5 |. m& F+ u
复制代码 运行结果- [[ 4.12414349]
8 W; ~8 v+ b* i' p' O8 i! V; H - [ 0.48007329]
c# f* p$ t5 h+ L3 J; y - [-0.6168482 ]]
7 \6 ~5 A2 a, s) }& b\" u
复制代码
+ W: z0 p, E9 n% i; { |
zan
|