- 在线时间
- 482 小时
- 最后登录
- 2026-9-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7953 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2978
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1183
- 主题
- 1198
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """, u1 h( f+ P9 W/ |- Y: k
- 函数说明:梯度上升算法测试函数( G ` e, ?$ |! |; B. L6 h# [
- 2 O( t! y) Z' }# S8 {; B9 R5 |9 ]1 ]. L
- 求函数f(x) = -x^2 + 4x的极大值
$ A& u9 X% R0 X0 F\" s7 [ - ) z! Z: `. [+ Y; d4 }2 u- v
- Parameters:6 C, t- Z; r7 v
- 无
4 ?$ F8 t- K) d7 M4 x0 W - Returns:3 p6 j. F5 V6 I2 J c9 K9 B; [- }; Y6 K
- 无$ F+ h: V9 \\" f
- """
' v' j) S\" z) {& `. ~* [; S* Q7 b - def Gradient_Ascent_test():5 @2 v( M% g. H2 a9 i& P
- def f_prime(x_old): #f(x)的导数$ _, \( [+ { I( _
- return -2 * x_old + 4
& K9 o& J Y4 }- l9 |5 q) a# x) m - x_old = -1 #初始值,给一个小于x_new的值, G3 g8 S# Q3 v4 [' z' @
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始8 Y+ P; w' ]0 G1 c
- alpha = 0.01 #步长,也就是学习速率,控制更新的幅度7 ~/ b\" b! w2 ]! o1 H
- presision = 0.00000001 #精度,也就是更新阈值
- s |* [( ?0 b( u - while abs(x_new - x_old) > presision:; {1 I f- T9 H) g7 r
- x_old = x_new- j2 B) G& q7 g
- x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
, i5 i; ]\" V& S/ W4 u/ R - print(x_new) #打印最终求解的极值近似值
+ o4 H% Y, G( U2 d5 x( _, |. Z
n# v5 F9 {. h' {9 e. ]- if __name__ == '__main__':
7 L# [* n/ q) c3 W) y - Gradient_Ascent_test(); T1 {% m\" X$ _8 ^1 I! n8 c/ B$ Q. l
复制代码 运行实例:- 1.999999515279857
2 F8 G: _: x; [\" z
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0\" \3 w, J! B' K* ?7 ~3 ]3 n3 J
- -1.395634 4.662541 1
e! g) Z# f0 U) N. f7 \& O' H - -0.752157 6.538620 0
0 w0 Y# Y\" [8 k$ g9 t - -1.322371 7.152853 0
\" p! C& C2 _) i - 0.423363 11.054677 0, t: f0 C g5 O8 p- h! K/ @
- 0.406704 7.067335 16 _7 p7 u- r( O
- 0.667394 12.741452 06 H\" ] p$ S5 u1 i5 s
- -2.460150 6.866805 17 N W) Z* B+ {/ {: G' o
- 0.569411 9.548755 0
% i4 V X9 c- I& @6 q - -0.026632 10.427743 04 D, x+ Y5 d0 J
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt6 U% b2 Q* `3 o7 S# S0 A
- import numpy as np- O5 ]( D- _9 q! I- g
! ~3 d\" t# W8 J6 e- """
: e- w/ v2 r\" E7 R - 函数说明:加载数据
1 V! @+ p\" T( ^4 a) P. z
4 y q( p* ^! c: W5 F3 z- Parameters:
6 s f+ W7 e\" P7 Q - 无
0 Q J6 ?+ X. h+ s/ \\" Z - Returns:
2 J, |2 l8 a6 ^& | - dataMat - 数据列表) ] ~$ @; o4 \. b* P- S/ l/ N' \& v
- labelMat - 标签列表
0 q. k2 q6 h/ j+ v& n+ W7 s/ { - """9 B t, |% U* e
- def loadDataSet():
O) N+ A- j0 {0 X: q) u - dataMat = [] #创建数据列表! w9 d3 h- ? n$ B, l+ w
- labelMat = [] #创建标签列表8 \4 e! r f* B& E5 F
- fr = open('testSet.txt') #打开文件 \" M\" z- u: `5 S\" \4 O! n6 B( U
- for line in fr.readlines(): #逐行读取
5 h; B6 @1 a/ g8 X8 V - lineArr = line.strip().split() #去回车,放入列表; i, ]0 i. x& G
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
( a1 z7 r3 j d4 c; V( H0 _; n - labelMat.append(int(lineArr[2])) #添加标签
+ ~( O) f T; g! }! s8 }. P9 ] - fr.close() #关闭文件
8 Q4 Z; @, k1 D: k\" V* x: O0 U - return dataMat, labelMat #返回
\" S: ? d) {\" S7 q' i/ R) Q - ' j& |1 T, k: t9 R' H
- """
3 n& i j) J: |\" C; Q - 函数说明:绘制数据集
; ~7 P0 }- y$ K, h - 1 ~4 ^4 f% i; F9 v+ q
- Parameters:
- B% Y4 ?% b. w p6 ^* o - 无
) b' A/ V. D: X4 ^, _7 E ~, } - Returns:
6 P+ v* y$ R' J4 G, D - 无
! A \1 b& B- T) z3 K7 d - """) H1 s) \! x- d: Q- h+ ^# m
- def plotDataSet():3 g5 {$ G0 S8 h: \
- dataMat, labelMat = loadDataSet() #加载数据集# ~\" w+ S* k/ V# h
- dataArr = np.array(dataMat) #转换成numpy的array数组
$ V, [; W& O( d' G - n = np.shape(dataMat)[0] #数据个数: v# w( v. i1 h- r2 B$ W
- xcord1 = []; ycord1 = [] #正样本
- i* S/ M; W: Q% `! p* i4 J% S - xcord2 = []; ycord2 = [] #负样本1 L, H) f2 I4 ^* \/ Q* ^
- for i in range(n): #根据数据集标签进行分类1 e% c! f9 r) R
- if int(labelMat[i]) == 1:
( g4 N9 n* c7 j6 G$ q - xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
0 k' f+ G- F4 Q - else:+ S6 l5 G v5 U, _ q\" E$ x* t
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本
# e( i( p) u% b. G4 o6 k - fig = plt.figure()+ x! N0 H2 {7 C2 m- U
- ax = fig.add_subplot(111) #添加subplot2 c5 C6 ]. M0 B' }6 g1 h) y
- ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
~6 m t8 h; b. |5 I( w - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
- M$ w6 `\" `, k2 u: g$ o D3 N - plt.title('DataSet') #绘制title' ] g% W% |; E5 b1 f3 ^- g
- plt.xlabel('x'); plt.ylabel('y') #绘制label% Z\" ?0 C; G7 N\" _( A' J5 i
- plt.show() #显示/ b# j* N' `( z: l1 H4 P( V/ P
2 D( T0 c+ V ~- n( N% L- if __name__ == '__main__':
6 N3 x: q' M& F* v0 u5 u+ V - plotDataSet()4 y. L# h; I! M9 U% {8 D
复制代码
. y& x! H9 {2 P7 E从上图可以看出数据的分布情况。假设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
( r. Z4 ] ~% q3 w/ N) F
1 i2 P+ c* ]% F) W; S! M- """+ b$ w/ B( Z: N) e- E: Z
- 函数说明:加载数据& {* V- o. t1 o( c
6 g: d/ e i/ W( c0 W0 n- Parameters:) L# M8 _5 H3 h5 n4 e) E/ J
- 无, g' W% D% x. F$ ]! f
- Returns:\" T) e9 u3 X5 u( W) q7 Y1 S
- dataMat - 数据列表$ A, `! ]6 J- P+ N- y c6 c\" E
- labelMat - 标签列表
/ [9 S# p, P' B5 Q4 m) m - """
* e' L( w2 i# Q* U - def loadDataSet():. K) _, r4 N7 ?! R5 A! l; a# h
- dataMat = [] #创建数据列表% r, t; \7 `\" ]4 ], ^5 r6 H
- labelMat = [] #创建标签列表5 ^- K\" c3 w+ |
- fr = open('testSet.txt') #打开文件
0 L9 L- b: n& a! S. ]% k! } - for line in fr.readlines(): #逐行读取/ v2 c b% r. j
- lineArr = line.strip().split() #去回车,放入列表1 d9 {6 ~( l4 t, d) t
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
. y4 o0 b, F* J1 C f# j0 K - labelMat.append(int(lineArr[2])) #添加标签' J: J; Q9 p2 }- Z+ j
- fr.close() #关闭文件% ~; U8 O: T. N
- return dataMat, labelMat #返回
\" y y9 J1 V# o( q
% o) p- P2 U. T8 C; V& X- """
+ u4 ^/ |: w. U6 _8 l - 函数说明:sigmoid函数
, }& k! j8 p* b& H/ P - 0 g/ f$ d! D0 D: h( ~7 y/ e& v
- Parameters:
7 a, E' e( L. v( e: z5 W* v - inX - 数据7 H* p: ^\" u. p) K4 T% L/ l
- Returns:
# z( {: ^. Z7 p( K - sigmoid函数# p4 q5 c9 z' N6 X, W* Z1 e
- """
/ S9 V* d\" Z8 ?; a7 v0 n6 x - def sigmoid(inX):
2 J0 b. g% ?# N. r) g# x - return 1.0 / (1 + np.exp(-inX))
; C1 h# x\" ]- h* Q e9 p# e5 {+ O
8 O) Z# N) J5 P- 7 _& j\" N' |! }+ y* M9 L6 t
- """
) K7 t7 K; p* z - 函数说明:梯度上升算法
. |8 `% l& f& M$ K5 k _8 }
2 F! J/ t\" \! V/ A- V4 [4 H- Parameters:' ]; L6 E\" {% o9 \
- dataMatIn - 数据集4 u, W) X8 t3 M' {
- classLabels - 数据标签7 ^' I# ~6 P- @& u! ~+ ~
- Returns:
+ Z0 `% R( f* W* Y2 x( K1 A - weights.getA() - 求得的权重数组(最优参数); I- P1 ?4 |9 P! I/ z9 ~: Q/ l
- """
( D6 D+ p! Q' e/ m$ u( v6 d; T, L - def gradAscent(dataMatIn, classLabels):% m( y: j9 P; }! k' ^9 o8 V- w4 P7 A
- dataMatrix = np.mat(dataMatIn) #转换成numpy的mat8 S) R$ h$ Z# Y n) v
- labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置
9 i2 L% t% e/ y8 c - m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
2 E: e2 M9 a4 o\" Z - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。
. G& O$ {0 K: r5 {& q% `6 H - maxCycles = 500 #最大迭代次数* b0 I' k- h; T\" K4 ?' j* b
- weights = np.ones((n,1))
5 | [! j, u- z$ e - for k in range(maxCycles):1 ~6 |\" D( c) N! D
- h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式3 F% S6 |. [, n& ^. x
- error = labelMat - h
# U4 G\" C- S2 o- ? - weights = weights + alpha * dataMatrix.transpose() * error
5 |, h# k8 u8 ] - return weights.getA() #将矩阵转换为数组,返回权重数组3 v2 }$ M+ R+ j; K$ n
- }4 q& ]7 U- M! \7 s3 A- if __name__ == '__main__':
$ a: k- }$ u# }6 V2 I1 n( G - dataMat, labelMat = loadDataSet()
3 U# t; h# u8 \& D6 C - print(gradAscent(dataMat, labelMat))
. h( @) o. ^6 L$ e; f% w( u
复制代码 运行结果- [[ 4.12414349]
: c\" B4 d t- g+ I3 r# C5 | - [ 0.48007329]
& C: V$ W. R8 I% v) C - [-0.6168482 ]]
( t3 v8 V( a. g
复制代码 : `' ^( D$ g; R0 g
|
zan
|