- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """
9 |' f% d/ c5 R C2 b ^ - 函数说明:梯度上升算法测试函数# I- G! \0 Z8 ?' S
- $ \\" |& o, _2 ]# H! Q
- 求函数f(x) = -x^2 + 4x的极大值 \6 G; Z8 C0 L* @* y
; R\" s A! c, J/ k6 e/ [/ x- Parameters:
2 D+ q; l: ]5 W! H: H\" M - 无
' g+ ~: g* j! `, O5 I! f2 Q/ r - Returns:. D/ P5 m& h1 d
- 无
0 _. c$ }0 X% b D - """9 K/ M9 P' x: m, S
- def Gradient_Ascent_test():4 `8 B' q; u# e( c% U
- def f_prime(x_old): #f(x)的导数) h; D$ F! U: X/ A5 q3 G( o. k
- return -2 * x_old + 4
: O+ u+ ~0 t+ ]# ~/ y+ Y7 @: e( u - x_old = -1 #初始值,给一个小于x_new的值
8 p p\" V- V6 W - x_new = 0 #梯度上升算法初始值,即从(0,0)开始
5 ?* e- U4 [5 q5 G, ?( R6 t - alpha = 0.01 #步长,也就是学习速率,控制更新的幅度- E3 R2 |\" u6 w8 ~' t% ?
- presision = 0.00000001 #精度,也就是更新阈值$ y' P$ j, ]8 P) T, X
- while abs(x_new - x_old) > presision:
\" [\" l6 P# ]/ t! ?8 ^ - x_old = x_new
% ?. y, f: S8 {# V9 I6 ` - x_new = x_old + alpha * f_prime(x_old) #上面提到的公式, ~) w- a- o/ }: t4 m' ?
- print(x_new) #打印最终求解的极值近似值
5 ~7 K# L\" m7 j* b - j5 m8 q0 G- ?2 g, o% o
- if __name__ == '__main__': _$ |$ ^6 D1 w+ G
- Gradient_Ascent_test()\" t- @: p3 Y\" R( L3 d2 K
复制代码 运行实例:- 1.999999515279857& z6 c\" e4 z8 ~- z# E
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0
C5 n2 y* i8 G - -1.395634 4.662541 1, w, F8 Y! O/ r
- -0.752157 6.538620 0' U5 l5 f2 J8 P' ^
- -1.322371 7.152853 0
8 v4 \) ^2 ~' j - 0.423363 11.054677 0
/ Y _ y) L. d: ` F) { - 0.406704 7.067335 1/ b: E, O( l' S
- 0.667394 12.741452 0
\" e0 M; m$ c! z) ~' l3 h% F - -2.460150 6.866805 13 d: D, W: v# K3 l
- 0.569411 9.548755 0* l& {) _% T! y
- -0.026632 10.427743 09 E* R* ~\" m1 s( `$ j
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt' O% ^: k. X: I
- import numpy as np5 s, w& e% N4 ?# P+ p
- $ Y( d4 y4 ?1 X8 J) ^, m
- """ Q3 L\" k* |2 F2 R$ X8 ?
- 函数说明:加载数据) f* g# V' ?9 C
- 0 x9 R/ S/ n! }5 X; ]
- Parameters:9 A) e+ z' _- n' i& Y ~
- 无
0 P* D1 V$ x) M+ I2 Z$ L; q! Q - Returns:
$ e. W2 p* q* S - dataMat - 数据列表
0 ]: w( g: U {3 Q$ V$ J8 B - labelMat - 标签列表, n( n/ O% W! B' `! t
- """; t3 _, P& S! [1 _8 v\" j
- def loadDataSet():
+ P4 ?( N. [9 F* D8 |! Y - dataMat = [] #创建数据列表
5 U1 i5 V3 b8 m- x - labelMat = [] #创建标签列表
* {' C: s8 [4 A7 S6 Z7 d - fr = open('testSet.txt') #打开文件
; e- t8 B5 R' l) ~* f* a - for line in fr.readlines(): #逐行读取
# E, u. @' U' q5 `' b4 N - lineArr = line.strip().split() #去回车,放入列表4 {5 Q& W# F- y) d
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
. _1 [, g, ^ h# ] Z: m - labelMat.append(int(lineArr[2])) #添加标签
' M ?+ ^6 u% S8 n, \1 b - fr.close() #关闭文件+ ? p, h( x0 W' |
- return dataMat, labelMat #返回
! A. `! l) Y% d- k! t) q* w8 J\" A9 W - + I/ I2 ~/ }5 g5 W- f7 U
- """+ M3 L. Z6 V3 w& T% h
- 函数说明:绘制数据集
5 m, d\" Y8 O2 e' s. k; n6 z
& @5 |\" F; y! z- Parameters:- |* o- j6 _0 s7 w4 @% \
- 无
8 J6 ~5 r6 b9 T! Q - Returns:
/ m- R) E8 A$ q7 l+ ?) |. X: i - 无
: F( A) `# V7 w% Y - """
0 t7 b B6 n8 J, n2 b - def plotDataSet():
\" c6 `% G5 K1 ?, A\" t - dataMat, labelMat = loadDataSet() #加载数据集# w# s3 T. ~$ A
- dataArr = np.array(dataMat) #转换成numpy的array数组
4 u1 v: }/ s3 w l) O! k' Y9 } - n = np.shape(dataMat)[0] #数据个数% B1 E. y% l# R# Q
- xcord1 = []; ycord1 = [] #正样本
2 B* l7 P+ G* x3 i9 c: E+ x- p- N+ ] - xcord2 = []; ycord2 = [] #负样本
. I* x* j- W# c, W0 O) D9 E - for i in range(n): #根据数据集标签进行分类! N- y5 P* y' y
- if int(labelMat[i]) == 1:
- N4 G3 D( ~% W( i) s& |* ? - xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
0 z4 C2 r8 r; C P - else: ]1 d9 W$ \: }6 Z
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本
7 k# W) m8 [ o5 j9 J) k$ \ - fig = plt.figure()2 x8 F& S. \+ T- Y: R. l
- ax = fig.add_subplot(111) #添加subplot5 ?0 y\" N\" s8 U* Y3 u q
- ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本+ _' i4 n0 e/ p
- ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
}! z- I' I# p: r\" i( f) \+ ] - plt.title('DataSet') #绘制title
& |+ ?$ g/ J1 O5 V3 R - plt.xlabel('x'); plt.ylabel('y') #绘制label
) _8 E: C% f7 b4 `3 |0 Z - plt.show() #显示
7 D- e& h: j) e# z - 0 e9 Z3 w7 V' u8 B/ A( b
- if __name__ == '__main__':( z7 A3 s$ C F- z/ z; z$ C5 U) p
- plotDataSet()
5 h+ ~9 h' U' ?7 l% @% s
复制代码
9 P e( ~' U( F. I从上图可以看出数据的分布情况。假设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' d6 F& @- y: \ Z7 Q
7 h# k5 }% v, H- """
3 a% V5 W' |8 F& \. Z' s! t - 函数说明:加载数据. p7 ~3 M7 @# D
7 {9 v$ t: u& d8 X0 m. ]. R- Parameters:
5 D4 k- |- x2 V$ O% m9 [9 } - 无
+ ]2 {% N; ^* I3 j4 H& K% t - Returns:
3 k3 c+ H) p; ]\" V! h - dataMat - 数据列表
' C- c# p9 P( c\" B. z. D& ]+ j - labelMat - 标签列表
# f9 I3 ?) d# u; [ T7 t2 O - """: o$ h$ E' _5 i! E) H
- def loadDataSet():0 v. `8 \/ U% d$ `+ T. w
- dataMat = [] #创建数据列表+ y8 D. ?9 n0 j6 z1 b. V
- labelMat = [] #创建标签列表
1 H; Q- x& _5 |, w - fr = open('testSet.txt') #打开文件
$ ~: T! q3 h: E, q e; j0 H# L - for line in fr.readlines(): #逐行读取
! t0 V# H2 V3 c \4 \+ ]0 ^3 { - lineArr = line.strip().split() #去回车,放入列表: f! v( }+ l; f' P+ x; w$ b- w
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据$ {; b: [$ C$ o
- labelMat.append(int(lineArr[2])) #添加标签
( N8 @) W7 g' F - fr.close() #关闭文件
: \8 x9 Z; x& G' L: v8 f - return dataMat, labelMat #返回\" D$ N1 H- ?4 V; D c- _
- \" [4 b# Q\" H; ?! b* i* Y5 G. ~. \
- """
) n T# s- n0 ~9 \\" e - 函数说明:sigmoid函数% y$ `% b: L t8 i x7 c# i$ N2 _% `
3 p\" i, U6 Z# ^4 Q6 E6 e- Parameters:
# S1 ?4 a: q5 E/ ~! g, k6 A - inX - 数据; p# l3 E9 a* U0 ?( J7 k
- Returns:( x4 s1 Q! u) y
- sigmoid函数
8 M) [3 u( U( j! C - """
* C2 W# w7 D2 W C - def sigmoid(inX):' w6 ]+ b4 k1 m' J/ R( R
- return 1.0 / (1 + np.exp(-inX))+ N6 N4 z0 S5 Q
K4 g5 W% E% G' Q- ; h7 x% m5 F) J6 g
- """
1 E+ M( b. ~\" a S - 函数说明:梯度上升算法
% D1 W! F7 n# @4 { - , h% u( ^3 B/ D M5 R$ [9 i
- Parameters:
! {7 Q! ]+ K% h1 ? - dataMatIn - 数据集\" X3 [) o* _( l
- classLabels - 数据标签
# X( B5 |3 S! H k+ G8 B5 z - Returns:
0 l2 Y7 t* `& [+ T. @% O - weights.getA() - 求得的权重数组(最优参数)) W) S) u* ~0 L
- """+ ~$ N) G$ x: k0 ^
- def gradAscent(dataMatIn, classLabels):6 N5 \% }$ v. |. k& c0 w
- dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
. r- m5 q7 w0 ?$ a& \ - labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置
/ u0 G1 G* n. z$ v ] - m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。$ r4 ?: S: a: e$ z. ~# K2 E
- alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。
! }+ A! ~/ f$ ~2 [5 G0 j: F. ^ - maxCycles = 500 #最大迭代次数2 x# [. X* n1 |- e
- weights = np.ones((n,1))
\" i7 p& b3 \& l! E, X5 i1 ~+ w0 g - for k in range(maxCycles):
' A% f3 b: H1 L9 l! T5 Y* J - h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式
1 Z& S& ^9 c8 R6 v9 f6 ` - error = labelMat - h
4 S0 [3 I. C& N/ q3 h - weights = weights + alpha * dataMatrix.transpose() * error3 V! V- L( F/ _& K+ }, G( @7 o
- return weights.getA() #将矩阵转换为数组,返回权重数组
% T4 Z: ~# [3 B5 U( A - 8 y3 n( E/ o+ n
- if __name__ == '__main__':0 N: O9 Q' E: h1 q
- dataMat, labelMat = loadDataSet() ! _3 L& V$ k) t5 `& t/ C& B
- print(gradAscent(dataMat, labelMat))
* l S: O5 G3 H% ]
复制代码 运行结果- [[ 4.12414349]; Q3 H* i\" M! f/ J
- [ 0.48007329]
' b5 C2 C( f2 G4 |/ r - [-0.6168482 ]]
# u1 [* N' r9 W; r& ?\" k' G
复制代码 8 ~3 V4 g9 W1 B0 q1 y! e: L
|
zan
|