- 在线时间
- 478 小时
- 最后登录
- 2026-4-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7788 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """- n\" X% d/ M9 S1 z& P4 V
- 函数说明:梯度上升算法测试函数
# e1 w$ N; \5 _* v4 O: ~7 z, b7 z. G
) G) D5 u: o6 u3 E# v- 求函数f(x) = -x^2 + 4x的极大值
: v Z3 A8 y0 S4 _ - \" m+ ~+ E B% l4 y6 o! [
- Parameters:' o- T/ H+ {# N+ r1 B' u& M% j
- 无
# K# k' ?! b8 z6 W0 @2 O - Returns:0 i/ B j& U8 ~
- 无
* O- D/ P. H; g' a. e' V - """3 O) W; F4 Z4 @2 G8 ]
- def Gradient_Ascent_test(): I/ B3 A5 L# E1 s
- def f_prime(x_old): #f(x)的导数2 g4 Z9 ]1 \0 g% A3 `) X
- return -2 * x_old + 4! g# G. \ |. N. D3 M
- x_old = -1 #初始值,给一个小于x_new的值5 A4 @( J0 @; e7 v1 A# U$ C
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始
% C' U T2 L2 g; [! i - alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
$ V, o, T4 J Q* r - presision = 0.00000001 #精度,也就是更新阈值
% |% C' Z! P* U0 F- ?7 J/ ^4 d - while abs(x_new - x_old) > presision:
: ]- J6 _2 ~& E - x_old = x_new6 M- f- t$ _% t7 g& j) J
- x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
0 {1 Z( L6 g8 Y: N) m - print(x_new) #打印最终求解的极值近似值! z) ?7 r+ `, k7 Q
- T' V1 s& ?- P1 t: s9 R
- if __name__ == '__main__':
8 A2 q% H* k% w' [/ V3 @: t - Gradient_Ascent_test()
+ ^# Z$ [7 y7 s( J- {
复制代码 运行实例:- 1.999999515279857
9 Y0 M8 T: ~% p7 @3 j% O# y. n
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0\" D8 |, S# N' S. o4 X- X* ]
- -1.395634 4.662541 16 ?; g\" X6 _# `& z: c0 ]6 E, G
- -0.752157 6.538620 0
1 @! _3 g6 ]: U7 q' @% \5 m - -1.322371 7.152853 0+ i; i8 R& f0 o7 ]7 t
- 0.423363 11.054677 0
, k4 e( S9 L5 T - 0.406704 7.067335 13 U# w: V' K- s' p, v
- 0.667394 12.741452 02 p# X8 W7 [# s$ n' r
- -2.460150 6.866805 1! ?% _7 Y3 y2 }# g% ^\" @
- 0.569411 9.548755 0
4 V3 _* @+ z1 S5 j\" ] - -0.026632 10.427743 0, @( \! f$ x- a; m+ o- K
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt
0 R& W8 |' o. m - import numpy as np5 s5 Z& \7 }+ }\" D
- ( a& g. r# p6 [8 I\" l
- """4 O3 @7 A a% V4 t8 U\" q% C8 ~
- 函数说明:加载数据6 E+ t3 u* q3 Z* F9 E% C2 {
: J# p1 z) m$ h1 ^- Parameters:
( I: ` Z9 n+ g8 R\" A) z - 无
3 q8 }. J! b2 o/ X; g - Returns:
. h) N; I\" I# R+ O - dataMat - 数据列表
$ [9 ] ^8 N\" }7 e) ]+ j* k - labelMat - 标签列表
! x\" @3 [* z3 k4 H7 R - """
5 p' Z0 Y7 a% x8 o; c+ X - def loadDataSet():: Q8 u! n+ ]3 T) A: m
- dataMat = [] #创建数据列表9 f! {( t. W8 j9 x' a$ H2 L2 W
- labelMat = [] #创建标签列表, c7 D% u F7 \4 n2 a2 @
- fr = open('testSet.txt') #打开文件 % [$ ^8 @; m+ ?3 m0 I
- for line in fr.readlines(): #逐行读取% V* X( t7 n( K; m
- lineArr = line.strip().split() #去回车,放入列表
9 `6 x P- h3 ^3 A - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据7 T' I& F4 h& i4 \8 q7 u
- labelMat.append(int(lineArr[2])) #添加标签- e x& C5 U# Y M' E8 I5 T
- fr.close() #关闭文件1 z2 Q1 O: A, e. F. U6 Z; p0 v
- return dataMat, labelMat #返回) y: v9 F* W ^. A
0 p, W# a1 a) T3 ]- """+ V5 M- N: i6 V: V
- 函数说明:绘制数据集
) i. r9 S5 ?+ J+ ~$ \
s4 S) ~! Q4 B* F7 U- Parameters:
! `. M4 d2 o% ~/ z# _6 b9 s B - 无% X* K- f. e7 p; O) M8 A
- Returns:% P7 G# h U\" n4 y9 q
- 无
8 W9 ~/ ` i# q - """
% n7 Y& I# E8 _. F* i+ P8 [; m* l' g1 U - def plotDataSet():
% F8 ^% s7 j4 F) ?) ]$ U - dataMat, labelMat = loadDataSet() #加载数据集/ ]4 b; Z+ j; T9 H4 }
- dataArr = np.array(dataMat) #转换成numpy的array数组% H) t\" _$ A% A1 ~
- n = np.shape(dataMat)[0] #数据个数& T: j6 V: q9 J* Z
- xcord1 = []; ycord1 = [] #正样本
) ~3 P1 O \$ Z2 P - xcord2 = []; ycord2 = [] #负样本) Y0 J1 i) h2 [4 H( ~
- for i in range(n): #根据数据集标签进行分类
7 k& b\" q( M7 `' q* w6 v - if int(labelMat[i]) == 1:
2 S2 B5 {\" v! q2 [- R; s - xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本4 n\" u8 t* \/ x\" L
- else:/ l& W\" @$ {9 w6 n) }- N5 r& m
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本, J5 O' o9 U& `! Y
- fig = plt.figure()
7 Y8 m; k& P# Q - ax = fig.add_subplot(111) #添加subplot, `; r2 Q. p* v/ J
- ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本% h2 _/ F2 Z- a/ v
- ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
9 o! D\" y& I7 j7 u0 {& t) n - plt.title('DataSet') #绘制title
9 d6 z6 ?3 A4 J# J - plt.xlabel('x'); plt.ylabel('y') #绘制label( ?0 r- |3 D. q$ S5 p
- plt.show() #显示
# c; ?$ u( n6 M7 M% F& E- K - x0 G, B3 D, F\" I J+ j$ M5 n- U
- if __name__ == '__main__':
3 Q4 t+ L* S; {, q, E! C- C9 P - plotDataSet()
6 ^1 D! t- z$ u$ u1 A1 X G2 M9 d8 ^
复制代码
4 J0 [& O) T* I0 y4 z4 D& \
从上图可以看出数据的分布情况。假设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$ g6 O( \) Z9 {/ X
2 S- S0 z: a) |* t- y. O& \- """. W) z. F3 H) J\" K5 x3 a7 j9 u\" Q% l
- 函数说明:加载数据7 m3 n- M9 X. b+ {# n) Q% }
- ! Y- F; x s0 _
- Parameters:4 L3 A! c) l$ _
- 无
. j- G& N7 f# l9 h3 ? - Returns:
9 L2 N$ ^/ S. y1 G3 h' e; J - dataMat - 数据列表% Q$ z' }5 q) L
- labelMat - 标签列表! h5 H4 B; j8 B( o# P2 G B
- """
( h& U4 R. Q! ]6 V& O - def loadDataSet():$ A! f9 T# r. I\" w/ u# x4 ]; r( z
- dataMat = [] #创建数据列表' u8 r& z4 |; z! x
- labelMat = [] #创建标签列表. R7 M7 r$ P# d, r4 t# `
- fr = open('testSet.txt') #打开文件 1 m. i) t$ Q$ k& u
- for line in fr.readlines(): #逐行读取1 N/ T\" l. Z. Y6 B% Q) f
- lineArr = line.strip().split() #去回车,放入列表
' w3 P6 m8 j; e - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据; x1 a# x$ _, x% x9 w3 |3 N4 ]
- labelMat.append(int(lineArr[2])) #添加标签
, ~; v6 u( f5 H1 Q8 w - fr.close() #关闭文件
' }( R/ Y \, I* D7 r - return dataMat, labelMat #返回
8 |( A; U6 }7 y - 7 A/ I. O\" c8 L. O
- """: r* g9 [2 h/ B2 m$ y# \* p
- 函数说明:sigmoid函数8 ?5 s7 c, A3 Y6 l: A, p- S# g
* P- U2 i+ U, M9 C4 n6 q- Parameters:+ w: `6 U& B: y1 v& W; t
- inX - 数据
C\" r. a\" z! A+ _& e+ X - Returns:) P& p% W, z5 S; b8 E) O
- sigmoid函数
9 j: o1 I3 x& z) \) n; i4 O2 u - """
# b, }! c( ]( b) ^/ E - def sigmoid(inX):
- ?2 Z% ~; s\" L- O0 o3 e - return 1.0 / (1 + np.exp(-inX)), Q- b4 Q& _9 S\" x5 \/ _
& j% J5 m/ \6 E! p/ B5 ?
6 l1 T+ E\" ^7 n a1 \! |8 |- """
$ S: [+ b% {* W1 }7 d* t Q4 P - 函数说明:梯度上升算法
3 `+ f7 t& z3 t9 a0 a - 3 X3 v( r# C; n1 ?6 i
- Parameters:9 B* D! V) f, p& z* B4 A) }
- dataMatIn - 数据集
8 Y5 s3 h. l# K P6 j. U - classLabels - 数据标签
& D8 e' D4 b% R% X7 M - Returns:
* R\" d0 L$ o; `& Z - weights.getA() - 求得的权重数组(最优参数)
! w1 E- ]7 Z4 E8 ~8 k# n - """5 c0 i [1 t |, {6 [$ U& \\" c
- def gradAscent(dataMatIn, classLabels):
7 V2 s7 v% K6 i: v& V$ k - dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
2 c% J/ _$ u3 a: H' O - labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置
/ C# g: [. p/ j. X$ ^! \1 z' w/ v - m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
/ r0 @* x# Q0 [4 L - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。
0 A5 |( R' j- u, } - maxCycles = 500 #最大迭代次数& b. Q0 q- B e
- weights = np.ones((n,1))
; \& j; j$ ?/ G% b( A/ t9 Y - for k in range(maxCycles):$ e$ X: Z0 w* Q0 {( ?* X
- h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式( _) k+ @: O/ T: E3 g5 ] l
- error = labelMat - h
- N( W3 d' P* u A6 ~( \9 r5 S - weights = weights + alpha * dataMatrix.transpose() * error
5 }7 u% A* z1 M - return weights.getA() #将矩阵转换为数组,返回权重数组7 h- T# \0 A6 V: y3 w. u! _
- 2 T+ m& i\" I' p8 r
- if __name__ == '__main__':9 ]\" G3 ]2 u3 x. h
- dataMat, labelMat = loadDataSet()
/ Z& R# w\" b/ `; U- J2 a9 s - print(gradAscent(dataMat, labelMat))% }\" [: ?+ {1 Q6 v8 I& `
复制代码 运行结果- [[ 4.12414349]. H* n\" h. T* d
- [ 0.48007329]
+ k1 F0 U6 [( N5 o. U( q5 j5 Z. ] - [-0.6168482 ]]5 z6 g& c @% Y\" ]- k, I# w
复制代码 ; O. d) ?, O- m2 @& e: |. L6 K
|
zan
|