- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """7 Z( J# T9 d: q# y7 Q: j( x, p5 O
- 函数说明:梯度上升算法测试函数 ]5 n; D, H t
- ) [, t, z9 c9 P( e6 {
- 求函数f(x) = -x^2 + 4x的极大值
4 A9 f. F4 D# R8 y2 r - # D8 F% n- A- I* A8 y. M# j% A: d
- Parameters:
- Y# v3 l2 O# t% U: d' P - 无1 Y9 L4 m$ `; O4 E8 l
- Returns:
7 Z5 M) t; [# S1 f6 b5 x. I - 无
7 I5 f% W7 M, G5 p$ [* _$ F - """. Z5 c# s% y3 ]
- def Gradient_Ascent_test():
, Q- e5 s: o% G: X - def f_prime(x_old): #f(x)的导数
$ b\" O2 r. W: a1 L: a - return -2 * x_old + 4
\" p- y& }3 M$ O$ m( V) B5 n - x_old = -1 #初始值,给一个小于x_new的值9 v: e5 P5 ], s( g' j
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始, m! K1 s. ?* e' i5 s, N
- alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
- m }# a\" H0 M4 \# b) e1 _ - presision = 0.00000001 #精度,也就是更新阈值
! N: Y+ {% ~( s7 W) K% T( } - while abs(x_new - x_old) > presision:
8 L. ]$ K( o% ^8 f - x_old = x_new
3 q# V! U, i/ x/ p. S6 t - x_new = x_old + alpha * f_prime(x_old) #上面提到的公式' l( N6 j+ `4 M+ g$ p9 A9 g. r
- print(x_new) #打印最终求解的极值近似值' S, i5 H7 W3 c1 n! H: M' G
7 \& A/ V5 L, K. [* o- if __name__ == '__main__':9 t4 H5 |+ x\" K7 c2 M
- Gradient_Ascent_test()
; x( _' R7 S3 \% W
复制代码 运行实例:- 1.999999515279857
Y3 }. [* }; E3 J I x
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0% d, x\" _7 N4 K0 O7 R: F2 q' J
- -1.395634 4.662541 1
& x& m. E/ G# n% s8 S! @6 o Y - -0.752157 6.538620 0
$ s( U; i, n3 h6 g- N - -1.322371 7.152853 04 C; X5 n) q; l& x: ?* l: w
- 0.423363 11.054677 01 R4 `, t5 ~6 Z9 n$ q1 S
- 0.406704 7.067335 1( S' I M% K. _4 `
- 0.667394 12.741452 0
5 ^ U; l: H2 j - -2.460150 6.866805 1; c' M/ w! e* P) Q \5 j% `' B1 z: n
- 0.569411 9.548755 01 K( y3 F4 Y. Y& L: k/ C
- -0.026632 10.427743 01 z0 g\" K4 ^7 _( ~0 i( l$ Q
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt2 x a9 m' K' k/ V5 x% h+ r4 ]5 W
- import numpy as np
( U; d0 ]# V$ _+ Z - t7 G; x9 u! P7 s P- Q9 F\" ^
- """: i2 r! [3 {5 p# D! L% S
- 函数说明:加载数据
6 O/ n' n: L L6 z1 t/ J# E8 K - # Y) x% C# B8 P) C c/ W; l
- Parameters:' a$ G- H4 a1 X\" B
- 无
# b( Y# X# x2 K& `5 ~ - Returns:
1 U9 ?% w5 V% B) m& f1 I - dataMat - 数据列表
# B/ X& ?& W( P/ R; i7 R3 ? - labelMat - 标签列表
/ n. ^/ p0 e* Y, G - """& @+ `6 z% N5 a' N/ l3 y
- def loadDataSet():
' F4 m! P$ w c4 R - dataMat = [] #创建数据列表
9 U; T\" p\" d) k) N% {( @' n- K - labelMat = [] #创建标签列表4 i6 m' @! X( B
- fr = open('testSet.txt') #打开文件 1 _) S, c3 q6 f' D# I
- for line in fr.readlines(): #逐行读取
8 W8 V5 j+ v3 Q& C - lineArr = line.strip().split() #去回车,放入列表# Z3 S. }5 F( b2 A' M# s
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据; G2 R% @' B; _* n- ]( N5 A
- labelMat.append(int(lineArr[2])) #添加标签+ Z) N2 k( \9 H- H% n1 B
- fr.close() #关闭文件
! h- p! |. z9 l\" V( k- U - return dataMat, labelMat #返回
; |* z* w, a( P i
% s) y1 d2 L$ w7 I) K3 [- Q- """
; K5 V& d1 R, `( ^: w9 n - 函数说明:绘制数据集/ T- X6 }- n, Q
- * u\" p8 M( Y8 @' j- e
- Parameters:
9 Z$ e& M! K3 h9 j( s% E. y - 无( Y. M6 Y0 I- n, r\" I# T( Z
- Returns:6 v; | ]' Z5 s7 _
- 无
- n2 M& W# G. @+ A7 _+ N - """
7 j6 d7 |( ^; Y) w - def plotDataSet():
- k4 A. s, A- x% Q I6 E - dataMat, labelMat = loadDataSet() #加载数据集2 k/ x0 B. a, H0 D8 }/ X' _6 h
- dataArr = np.array(dataMat) #转换成numpy的array数组
2 M9 y7 L2 `7 L2 i - n = np.shape(dataMat)[0] #数据个数
\" v2 n\" |* u: u8 o0 k$ K% A8 ~ - xcord1 = []; ycord1 = [] #正样本
1 _1 W* c5 i7 y/ j$ z+ k - xcord2 = []; ycord2 = [] #负样本- D\" @5 Y2 \) K3 k( b Q- |
- for i in range(n): #根据数据集标签进行分类
- T0 J- @* U9 I6 ] - if int(labelMat[i]) == 1:
. s$ P5 m6 ^$ ]& v) f1 z - xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
- ~0 \5 p) T% C! x! } - else:. @: L3 `+ u$ N9 Q. t- F\" Z
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本9 P2 v1 r5 j0 `! _
- fig = plt.figure()
% R* w! N6 T- k - ax = fig.add_subplot(111) #添加subplot
* D, y$ g9 K/ i$ g\" \ - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本$ r; J4 S! ?( g3 T% w# O
- ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
# q2 A% x U: L! b( K6 W - plt.title('DataSet') #绘制title
; b* W2 @6 e$ @2 w b - plt.xlabel('x'); plt.ylabel('y') #绘制label
- |, e1 K\" S8 X. A5 e - plt.show() #显示
! q) X2 ? ~/ T3 Z0 u# d - , l' ?$ s3 n- t3 _\" B
- if __name__ == '__main__':, D$ U7 N; k# I, ^
- plotDataSet()
' I( p- ?. ], Z4 {' Z& B
复制代码
+ t% E8 ?+ j7 G2 w U2 H8 r% X
从上图可以看出数据的分布情况。假设Sigmoid函数的输入记为z,那么z=w0x0 + w1x1 + w2x2,即可将数据分割开。其中,x0为全是1的向量,x1为数据集的第一列数据,x2为数据集的第二列数据。另z=0,则0=w0 + w1x1 + w2x2。横坐标为x1,纵坐标为x2。这个方程未知的参数为w0,w1,w2,也就是我们需要求的回归系数(最优参数)。- import numpy as np6 p X) @3 D- [ c5 |! o- D
- ' \. |% I8 i6 ?$ Q
- """
4 m: Y, _: @% I\" V - 函数说明:加载数据
: D\" L) z! w\" F+ x
0 v ?( u\" }( p4 F- Parameters:6 O# u6 H% x8 E5 y( G* w
- 无
5 v; w4 t$ o' t5 b+ p$ ^ - Returns:3 W\" r4 a3 k0 |7 ]
- dataMat - 数据列表
6 S9 l* d4 L O3 O: x - labelMat - 标签列表
) r( _* E; J, k( D3 C. v - """
$ P% t4 n7 ^4 {' O& t - def loadDataSet():: ^% j\" G$ R# ^! \% b0 [
- dataMat = [] #创建数据列表6 M2 ]/ ~2 S9 G
- labelMat = [] #创建标签列表\" m4 D n' ^0 l# K% w
- fr = open('testSet.txt') #打开文件 7 j: S5 z W) m# T. n( W5 a
- for line in fr.readlines(): #逐行读取
) ]4 d& O) w! q! [ - lineArr = line.strip().split() #去回车,放入列表
3 w& H3 ^- G- o# u9 Z - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
9 L Z( F6 p- K5 C( A* { - labelMat.append(int(lineArr[2])) #添加标签
\" {+ y# S0 c8 Q* `$ _) u - fr.close() #关闭文件
4 n8 N' |4 O/ ~& p* d9 y% { - return dataMat, labelMat #返回
4 P6 H( n! }0 `
: X3 }9 i: v' `( D ^- """
8 e% Y( T3 E& _7 _: R1 a - 函数说明:sigmoid函数
\" b8 }8 Q4 W9 e6 V& N/ g4 _
J; t! F5 l6 U' l5 k7 Y8 `2 T- Parameters:; I+ U* R* @+ Q8 d: p& j, y# R$ I
- inX - 数据2 ]% ~\" v8 W9 }& J6 e, S$ I I' V
- Returns:8 R7 H3 m7 {, n0 \; g4 x
- sigmoid函数% l8 }+ Y# G& f* v p, I3 T
- """
) q0 a8 B2 p# Y5 J+ T2 ?# a - def sigmoid(inX):% z# W\" C$ @+ ^* C\" C6 a, K
- return 1.0 / (1 + np.exp(-inX))
1 o; R' C6 Y6 |\" V3 {
* F: u2 |& _# D- w9 `0 i
+ z; q0 I9 ?5 O2 d9 O- v8 K- """0 `2 J\" q5 M$ v( |, S\" K7 j2 h4 I, M
- 函数说明:梯度上升算法
\" F/ L- A# }! v - ) d. n2 V+ j: z5 I
- Parameters:; e7 ?, r2 _, N6 X
- dataMatIn - 数据集+ O\" X( x\" }1 N6 l3 C
- classLabels - 数据标签
7 X. a [0 q4 x6 D; |1 u - Returns:2 Q0 Y4 x# i+ v! S! m
- weights.getA() - 求得的权重数组(最优参数)7 O' g& i: M4 ~, h& u
- """
5 V! v0 g3 F8 u) D) C( t - def gradAscent(dataMatIn, classLabels):7 q; M& E. ]& [0 W\" B8 ]' D! ?% L# [9 o
- dataMatrix = np.mat(dataMatIn) #转换成numpy的mat5 z1 N+ L7 @* D) V0 t
- labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置
+ e( b0 ?& }- \& t0 Z$ } - m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。6 @\" f- C* v9 U& \8 P/ J: V; j
- alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。
! O3 |\" M5 c( \9 G5 _) Z m4 t# a7 n - maxCycles = 500 #最大迭代次数0 S# p3 t5 g: S; G
- weights = np.ones((n,1))7 K- d/ Y0 t3 I5 V; C w2 q' I
- for k in range(maxCycles):
0 ^5 [& ^( m& r/ M3 K/ @/ e) y - h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式8 v& n# Q2 O3 a8 Q- o
- error = labelMat - h
# J2 \8 h' p, \ - weights = weights + alpha * dataMatrix.transpose() * error. s! |9 `5 J9 J: r) a0 e
- return weights.getA() #将矩阵转换为数组,返回权重数组8 m& q7 r\" ^+ i& R+ ]
4 [+ b$ `( ]6 n- Y) v- if __name__ == '__main__':
' G' V3 l3 f- W6 a; u1 J1 b* m( g0 j: ^3 l - dataMat, labelMat = loadDataSet()
! a S6 j9 b5 D9 ^* t' C+ \3 m - print(gradAscent(dataMat, labelMat))0 M7 v/ L: o% j( o( \& | Z
复制代码 运行结果- [[ 4.12414349]
5 K- P9 C3 f/ a - [ 0.48007329]
0 W( q* A* Z& s7 y - [-0.6168482 ]]& Q$ B+ }, ~0 [
复制代码
# J& N J: b l* N# N' j4 s( K X |
zan
|