- 在线时间
- 472 小时
- 最后登录
- 2025-9-5
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7679 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2884
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1161
- 主题
- 1176
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """
9 F/ ]: G- m4 l/ Y - 函数说明:梯度上升算法测试函数
7 B- A% ]. v* n - ; \7 q! C1 U |0 e! a3 z: T2 B* ?3 N
- 求函数f(x) = -x^2 + 4x的极大值
# b( s$ g. B [# `( v- M0 U4 R - 3 G- `5 d; w! s
- Parameters:
, Z- k0 q8 I0 g2 [ - 无) V0 O4 R7 D/ | Q0 ^$ o
- Returns:
0 w7 n! y Z, Q2 o7 `) ? - 无6 o M# r i, z1 Q, `6 e
- """
9 s6 ]0 M2 S* B% a# V- n y - def Gradient_Ascent_test():& h: i2 I; b5 W
- def f_prime(x_old): #f(x)的导数* Y h: s0 r K' Y# c8 |
- return -2 * x_old + 4
$ L, j- E, D/ {5 k8 y - x_old = -1 #初始值,给一个小于x_new的值4 I9 T! O2 C- z
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始
2 X. r- M8 U% d+ a& o4 A6 Q - alpha = 0.01 #步长,也就是学习速率,控制更新的幅度) G! [: D7 ^\" ]$ M% R V6 y6 P
- presision = 0.00000001 #精度,也就是更新阈值9 F+ B9 }4 f, K# f( ], y
- while abs(x_new - x_old) > presision:: P: e\" m! y\" E8 n
- x_old = x_new* |\" U9 \- b$ J8 M9 O
- x_new = x_old + alpha * f_prime(x_old) #上面提到的公式% g4 m, F\" w# m( } M
- print(x_new) #打印最终求解的极值近似值( h\" i/ B k0 L) e9 j
* S c. I* J2 r$ m8 V\" r' j( L- if __name__ == '__main__':
( e8 M* l# h8 p# }) ~% A8 s - Gradient_Ascent_test()
. T c9 U7 B. P: q a& p1 V$ y7 M
复制代码 运行实例:- 1.999999515279857 Z2 q( Q9 c6 j; o
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0' L9 t# p; n( v4 ~) l2 s
- -1.395634 4.662541 1! X) d- q( H: E; q8 d2 k6 u
- -0.752157 6.538620 0+ J n4 s- s( N3 Y x
- -1.322371 7.152853 0
, a% t7 n3 W4 q& f& i# f: V - 0.423363 11.054677 0) ~1 e1 n3 R6 u3 _7 k
- 0.406704 7.067335 1
, w. C! E4 {' Q/ ~+ l: `6 q - 0.667394 12.741452 0; X6 o- E$ w2 b3 Q0 w( F
- -2.460150 6.866805 1
! X' d* {$ O9 R9 O) Q& o\" k - 0.569411 9.548755 0
. u9 w( M \6 Q d) ?0 F: O( ` - -0.026632 10.427743 08 \: q4 a7 l. n; O7 p
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt
2 M& T3 F; _- C% u2 {+ ~6 W; V - import numpy as np* `; H6 \% T6 J, N
# {/ s+ |( T, R/ ]' F. F7 k+ E$ g; L! I- """! ]7 O. |$ \; Q h
- 函数说明:加载数据
& @, r4 [/ l9 G% I
3 q2 E' h5 A4 Z) t\" t4 a5 s* R- Parameters:; ~; j1 e+ }6 g
- 无
3 P- v% K+ \! Y3 A7 F2 M/ ` - Returns:
0 a0 N: @& H2 S9 Z7 }9 N4 k - dataMat - 数据列表
4 }6 Y+ [7 N( a4 J+ e$ r Q' N - labelMat - 标签列表
1 Q5 J7 l6 I F/ {! W3 X8 U, N. h& _ - """; Z* j5 \6 L, p\" K8 G. V5 Y; B# M
- def loadDataSet():
\" k7 L: ? Y; v% r0 J - dataMat = [] #创建数据列表
& F; V) u* d* [ H\" b# k& S - labelMat = [] #创建标签列表
. f7 A+ u/ O9 z8 H( c) H f - fr = open('testSet.txt') #打开文件 2 d# m5 h' J% B' j5 \
- for line in fr.readlines(): #逐行读取
% m' K) X' e% ~ B, F5 w - lineArr = line.strip().split() #去回车,放入列表% j+ b/ @; d4 o3 n: P; v
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
! K\" h$ t- r% `: W$ D [* z\" x - labelMat.append(int(lineArr[2])) #添加标签
3 _2 v' x- e2 M$ H% @ - fr.close() #关闭文件9 W\" p, ~) k5 ~7 \0 v! ^
- return dataMat, labelMat #返回2 ^6 x* a9 H( a: n3 u6 F8 D7 \- X2 ]
4 Q5 m7 U& Q9 H& g0 T- """4 N9 r. F' L# U( w) L7 {
- 函数说明:绘制数据集( I9 W S. S5 {' }+ Q3 C& i
$ p\" ~# J; x( h: D) S: P- Parameters:, v. u9 L4 O4 D O g
- 无
! \' [( b/ \0 M- Y - Returns:5 _/ [# g8 X6 b% A
- 无
) S2 e/ T1 E7 H* t; B. V w8 ~ - """
2 q9 n% m! Y! V) i; N7 P+ z - def plotDataSet():/ G t\" b% X5 D9 K8 r5 s
- dataMat, labelMat = loadDataSet() #加载数据集% `2 D5 A& E8 J4 J7 j f
- dataArr = np.array(dataMat) #转换成numpy的array数组6 J+ F% B# R. D# ~, P- d: X* Q
- n = np.shape(dataMat)[0] #数据个数- b* }- \; H( _3 e) _+ y) S* N
- xcord1 = []; ycord1 = [] #正样本
, I, G! x% I1 J\" E - xcord2 = []; ycord2 = [] #负样本0 V: E, g5 m2 v7 |! m
- for i in range(n): #根据数据集标签进行分类
( J q2 E* y$ V( V0 D) Z, m% M* ? - if int(labelMat[i]) == 1:% c% u2 }6 H* H: o3 Q* L\" g
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
2 \2 Y. |2 t- B\" w: d+ K - else:' l, x- F( D$ }% f; O6 _; r% i
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本
; M4 u! g' y; c4 \- U& @\" U3 `, r/ Y - fig = plt.figure()8 _& K0 M, }; q4 R) R0 U
- ax = fig.add_subplot(111) #添加subplot
* ?1 `: N5 c4 u% R, m B - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
0 d7 s2 C$ g5 U. o# N - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
5 g0 I: f1 h6 m. O6 { - plt.title('DataSet') #绘制title2 A; H/ {0 M\" U6 d# j+ H
- plt.xlabel('x'); plt.ylabel('y') #绘制label
7 ?1 n* P/ v5 p& a; E% K; w - plt.show() #显示
% v0 b$ O$ F- D; l - 9 _! i6 c! P+ @: V( G
- if __name__ == '__main__':8 I/ O I8 z; |! B$ l
- plotDataSet()
: U. o' A\" G0 E+ L ^
复制代码
$ e% q& A0 _; [, h. P从上图可以看出数据的分布情况。假设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
! ^) P% E) a; s8 b# t- _' \; F
( d' j6 }& t* C& s: _* o; Z/ t0 Y8 t- s- """
- s3 L, Y$ v! v$ [7 v. p - 函数说明:加载数据- N7 r, m/ W2 T9 @
7 y# {$ ?) J% N5 k6 l. a3 l7 N- Parameters:& q! ~, O# ^, r8 u
- 无
\" Z# t9 X$ L/ h3 }# K4 N - Returns:
; w6 t# K) T0 o# { o7 { - dataMat - 数据列表
+ F- Y- L; {2 O% L - labelMat - 标签列表4 X: \5 ?5 e0 }' _
- """ V7 s' u Q- }
- def loadDataSet():3 ]$ s! U$ p\" w, R2 y. v* I) I
- dataMat = [] #创建数据列表$ Z% f! q1 J: X1 Q
- labelMat = [] #创建标签列表0 ]' Q7 N% x0 Z9 B' e
- fr = open('testSet.txt') #打开文件 # b# ^( { W# } d& W: o% a3 `9 i) ?
- for line in fr.readlines(): #逐行读取6 _( n' e( x: r: y& h. e: j: G
- lineArr = line.strip().split() #去回车,放入列表
\" C. a4 _0 r& I, {6 T - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
6 X6 |: I. \6 M; ^* Q - labelMat.append(int(lineArr[2])) #添加标签
& L7 l. I' m0 z- G$ q - fr.close() #关闭文件
. f: K3 x: ^5 I# n7 M5 _5 I9 ~ - return dataMat, labelMat #返回$ x) Z; v, w7 X( N' w* ^
- * p3 _% s5 i\" y, ~
- """ ~0 Q2 P0 R3 j# C; R
- 函数说明:sigmoid函数3 ~: P$ o! r5 R [) E8 N
- \" C' R5 i+ R& A6 Y, z) {
- Parameters:
\" g: N \3 w8 |) p - inX - 数据8 H7 y3 a' z* M7 ?4 Q3 k
- Returns:. }. k5 y# A5 E# r5 y' Y0 U
- sigmoid函数
4 B9 L& n: m- D* }5 a4 n% p - """
- e1 h1 O: v. F - def sigmoid(inX):) q: R) m* G9 K% B$ Q1 w
- return 1.0 / (1 + np.exp(-inX))0 e E\" t1 b/ K, _9 ^& d
- 0 J: h, O' D3 l
- 4 M6 }( \4 m$ O
- """5 T* V. Y7 V9 S: o. U/ Q
- 函数说明:梯度上升算法; ^4 w* h0 @0 i0 O
) _* |$ C* e) g6 u! Y- Parameters:' g2 i9 I6 g( `
- dataMatIn - 数据集
0 c' p0 h) h3 Y, [) s5 U/ s8 k/ p - classLabels - 数据标签9 T* r; P- L- W# p' _3 r
- Returns:( J' U7 E0 M7 p5 V: u$ b: ^; r4 g. m: t$ x
- weights.getA() - 求得的权重数组(最优参数)5 a\" _/ w5 M8 Y% D
- """# D# O% n, W8 L) H5 O' i8 e
- def gradAscent(dataMatIn, classLabels):
8 G$ x6 u1 C2 C - dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
! C( x! k' W; R& A1 S - labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置: @/ B2 L6 e- b7 I2 t6 p0 S' t& x
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
9 C- [3 o' H5 k, q. t; d - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。
* Y) Q: { M3 T: e8 L( E7 z2 c - maxCycles = 500 #最大迭代次数
f& a+ z+ C- { - weights = np.ones((n,1))0 s% r$ h8 q! u$ \$ n1 K: F
- for k in range(maxCycles):
8 f* s- ?, V% W - h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式* M K) C* z7 F5 Z3 o J- j! S
- error = labelMat - h
: x7 [2 N& L5 y: h - weights = weights + alpha * dataMatrix.transpose() * error
2 w* I\" t: q0 y. g - return weights.getA() #将矩阵转换为数组,返回权重数组
% q6 s( l q) V4 e; Z! L) H2 h+ b\" T - $ W$ J+ Q' h% [; ?, j
- if __name__ == '__main__':
# Y' `0 j& _) @! e* F; W5 m - dataMat, labelMat = loadDataSet()
8 G% J& b9 [% ~2 z$ V( Q# Q i - print(gradAscent(dataMat, labelMat))
. ?8 M- o' T* c C' B
复制代码 运行结果- [[ 4.12414349]
7 ^5 J! @8 x$ h1 G5 V6 h\" J$ Q - [ 0.48007329]
2 r' b: `0 h\" Q: E; b - [-0.6168482 ]]. [ h' ~( }8 Y( C* ]' R
复制代码
. D& W. w6 @! E" l( G4 t3 r |
zan
|