- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """
4 E$ i6 E; K' v/ P - 函数说明:梯度上升算法测试函数4 `0 b9 q0 q2 ?5 K
% A# |9 M' I2 x w; q, x$ A- 求函数f(x) = -x^2 + 4x的极大值6 a7 y9 V* ?5 m: U) r! d
- $ l B- F3 T3 I! d& J' X; k
- Parameters: i- O' L9 B( E- ]
- 无: _9 p9 z4 b) N& r4 H& I
- Returns:6 e1 j\" B j6 C+ v& M5 l5 M
- 无
! R$ L1 l: p\" r! z7 m - """4 Q$ P( A4 N/ [3 t( n
- def Gradient_Ascent_test():
; u e+ F# A. _* o) W5 T e - def f_prime(x_old): #f(x)的导数4 n* A. n, ?# l/ q) I( y/ |
- return -2 * x_old + 47 |$ |% |\" V p8 _( Z+ h3 w
- x_old = -1 #初始值,给一个小于x_new的值
5 f0 ^* @- n1 x6 u7 r: q - x_new = 0 #梯度上升算法初始值,即从(0,0)开始7 |( m/ `& Z z# K$ f
- alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
# a8 N* k; ~$ ?* Q - presision = 0.00000001 #精度,也就是更新阈值
7 [* _4 L, S2 T9 e% M - while abs(x_new - x_old) > presision:
: g( q4 ?& F% J3 U& M2 B - x_old = x_new+ ?! F: Y' O; l3 I5 ^: O3 S
- x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
/ g S+ R0 V\" x% |% Y: H- k/ h% ^ - print(x_new) #打印最终求解的极值近似值. u\" I+ r# U/ m: B\" H
3 D2 G% D( v0 U9 n+ z; f5 [- if __name__ == '__main__':
7 D S0 v3 a8 O2 b6 r/ V( F X - Gradient_Ascent_test()
6 n- s\" V9 b# x6 x# }6 U
复制代码 运行实例:- 1.999999515279857 _' k, G5 T4 m# p: r
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0
' ~ d\" i9 i: P, z( T( C( v - -1.395634 4.662541 1
m. A w# q8 t - -0.752157 6.538620 0
8 P% j4 j) E/ D7 k, a! y - -1.322371 7.152853 0
- k {5 x i2 K - 0.423363 11.054677 08 N* v$ u: }\" I1 N; ?9 u2 K
- 0.406704 7.067335 1
3 Q6 E3 V& [* m\" {1 u\" D - 0.667394 12.741452 0* ^3 Q9 b: Z1 d) Q' Y
- -2.460150 6.866805 1
) i- F: Q: M5 O) ]+ }* _: b8 ~5 U9 L - 0.569411 9.548755 0! ]9 K4 D/ d3 w/ a Z5 _
- -0.026632 10.427743 0
# N, l' h4 G7 A' p1 |, ?
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt( l4 E1 j3 m# b0 s8 i
- import numpy as np+ U5 u1 W. F B9 k- S' m X\" c) {
: E, F' P; D- {4 D5 ?. j6 N- """
( k- u+ L& |( ~6 ?8 l\" { - 函数说明:加载数据
2 k1 }: \) ^. C' M0 x# U - ! m; V0 |9 r# o
- Parameters:
9 ^$ H, B/ r: }/ B/ n8 x0 E5 W2 ~ - 无; J Q( \! a }0 C, a# M
- Returns:
: b6 R9 g5 d' U+ Q2 h1 G. { - dataMat - 数据列表) u: g6 O# W7 c7 t/ H
- labelMat - 标签列表+ ?4 G, }- J/ O8 p* @
- """
- r/ M- l: Y6 b; |5 \ - def loadDataSet():
w\" m8 A6 t; {9 ]) A( s - dataMat = [] #创建数据列表
0 f6 f\" |% D0 i\" ~, `- Q* t - labelMat = [] #创建标签列表( L0 z5 ?# G @: B$ `$ `1 W3 u; i
- fr = open('testSet.txt') #打开文件 4 ?; F4 N/ p\" B& z |+ l
- for line in fr.readlines(): #逐行读取9 }$ R+ M' z4 S4 J( g6 A
- lineArr = line.strip().split() #去回车,放入列表+ s s& b) u. s( a; J4 y7 d2 e& F
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据 c& Y; F2 G2 h# N' w9 V, `
- labelMat.append(int(lineArr[2])) #添加标签! K* b. u4 f8 ~3 Z. P6 b
- fr.close() #关闭文件
5 f7 ^6 ?7 S# s% L - return dataMat, labelMat #返回
6 M; I2 ]& `3 v - 3 Z$ \0 U; N7 J\" b$ s
- """
( |: m9 V/ L7 l4 | - 函数说明:绘制数据集
( L1 @7 _9 \; e6 u* i
- t Z0 Y+ U! N/ D e, C/ w- Parameters:* G, N! v6 o/ d( J
- 无
8 d* D; n( c8 O/ J7 N - Returns:5 G$ m% g+ r1 f) _; a
- 无
* h% h# o( y0 r6 [ - """
: ^7 g! H8 m7 X2 X2 `' j; | - def plotDataSet():) C. m( S- P, l; }; m+ o
- dataMat, labelMat = loadDataSet() #加载数据集8 O$ C I, l& f' K. \
- dataArr = np.array(dataMat) #转换成numpy的array数组
& U! M: a) H) n% A) |/ C - n = np.shape(dataMat)[0] #数据个数
3 U* |/ Z. Y7 S; Y - xcord1 = []; ycord1 = [] #正样本2 c# H/ g: ~; E% D
- xcord2 = []; ycord2 = [] #负样本
\" a% Y/ o, }6 o& X' i - for i in range(n): #根据数据集标签进行分类/ K0 E\" a9 x- ^4 U
- if int(labelMat[i]) == 1:: U( e$ F# ]# E
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
5 V$ ?# p* H3 z3 T - else:
8 \' O- R; }\" o& p) w& U - xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本& w* {* E; E/ h( ]+ h( z7 c {& u
- fig = plt.figure()\" y O0 X1 ]9 A7 O0 A r; ~
- ax = fig.add_subplot(111) #添加subplot
7 H Z) L4 [, V. j' c4 c+ ^6 i - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
) |3 F! B4 O9 s\" z, u - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
! V8 p. k2 t$ t3 x5 B9 E+ k' l* A2 c - plt.title('DataSet') #绘制title
\" {; ?9 \- q( E: E' g - plt.xlabel('x'); plt.ylabel('y') #绘制label: ]! g4 Q\" F/ l6 @ c# t3 k4 s4 ?3 H
- plt.show() #显示
; V! m. U$ K! q: h
2 i( _% {1 z9 c9 S# U- if __name__ == '__main__':
5 @5 o. ]( u1 q: l - plotDataSet()# P5 I) Y. h# b/ Z\" n, k
复制代码
u q2 T' V; J9 ]" b从上图可以看出数据的分布情况。假设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/ t2 m3 x( i4 J9 m1 A
+ E! h; R4 `3 w, l. _$ U- """% \+ ], [, ?4 i# H
- 函数说明:加载数据7 \ l3 I5 ?2 h: f- n
- ' L8 b9 u2 ~' v }1 D8 Q5 z
- Parameters:
6 W- Y: V6 d7 ?7 e3 P k& ~. z! S - 无
- u/ P3 C, R! F9 }- r3 T - Returns:3 ]% Q+ H0 F/ M# q0 Q0 T) C/ @6 m
- dataMat - 数据列表
3 _( H\" x9 G2 d' l - labelMat - 标签列表& V0 U/ o3 Q8 J- \- r/ F
- """6 ]2 ?8 q8 P N$ n- n, R4 C# x
- def loadDataSet():
' l L- }+ K, _ Z; l - dataMat = [] #创建数据列表
4 Q, A\" b) Y& Q+ a3 g8 Y6 b6 r - labelMat = [] #创建标签列表
7 p [! {- ?& q - fr = open('testSet.txt') #打开文件 5 ?' V6 E g; f: y' N
- for line in fr.readlines(): #逐行读取
( \+ [! x6 C' [1 r\" K: R- x5 q$ ` - lineArr = line.strip().split() #去回车,放入列表
& f; J* I c! t1 o( u- n3 l8 Z - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据' x4 H. V/ \+ O
- labelMat.append(int(lineArr[2])) #添加标签% l* F* R! ]1 \* I. U9 Z$ [
- fr.close() #关闭文件
# |! w( v* z7 { - return dataMat, labelMat #返回! \, F5 @- s: H; u' \; F
- 1 K6 b) _8 ?. B! Z& y6 l# ? g6 l3 I* l
- """
8 B8 F7 x: c* D# F% X4 u - 函数说明:sigmoid函数
7 w1 K; y4 D: [4 D+ P4 A' Q/ r - ! e6 F% w' F% d% w
- Parameters:) \7 {: p0 g0 e$ y3 `
- inX - 数据
, J, N4 g! [0 s; x0 U N3 l - Returns:
S/ z! Q\" B8 {0 h# H& p7 h6 L Q - sigmoid函数5 e% q m- u$ _8 M) K\" z
- """
\" \8 x& P1 m$ K, q4 M) K - def sigmoid(inX):, E- G# b [1 D: t k3 T, |8 p
- return 1.0 / (1 + np.exp(-inX))
- {# U1 B! P! S! o/ G# _ V - * j' x, |3 T( j2 S3 v
- 6 I9 e& Y$ c. b# {+ @% g
- """2 ]+ Y3 W8 o3 L
- 函数说明:梯度上升算法
+ K3 z9 k) n; f! ]
' O/ I6 s( b\" U+ q6 I8 k- Parameters:
1 K/ k# E2 X\" [8 m - dataMatIn - 数据集
0 C# R0 r1 i9 p1 g U% _6 J& A9 O7 F - classLabels - 数据标签
: R( t: _: |; r - Returns:9 _) o\" q. P0 Q% v @, K, S5 C
- weights.getA() - 求得的权重数组(最优参数)
. {4 O\" n: L. A: Z& F( H; V - """
; L2 D- G& l5 T. @2 C z$ i* }6 i - def gradAscent(dataMatIn, classLabels):
# G- x\" l, }3 _\" G8 L% U* E: f - dataMatrix = np.mat(dataMatIn) #转换成numpy的mat+ x; c3 w4 A: P \8 |) E+ ~4 }
- labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置5 Q$ p) ?8 R5 I
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。2 `8 \5 {1 _! Q W
- alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。
% E6 u, O& d! G - maxCycles = 500 #最大迭代次数
) ?/ \, D; S! q8 P/ A- k - weights = np.ones((n,1))
\" {0 Y\" [+ F7 e+ K - for k in range(maxCycles):! C) Z; \) |0 ^0 o
- h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式
( _) e4 Q$ v- n- ?- L: r - error = labelMat - h4 d( v* U9 d$ U/ Y$ t5 T\" g: E
- weights = weights + alpha * dataMatrix.transpose() * error
7 k2 S8 `5 N3 f+ ?1 ?0 k F - return weights.getA() #将矩阵转换为数组,返回权重数组9 E8 L; k- q/ v$ _* R* H
7 x$ x2 c% x G- if __name__ == '__main__':
- t1 ?* Z% B, c& h - dataMat, labelMat = loadDataSet() * Z2 y, D4 Z8 q
- print(gradAscent(dataMat, labelMat))! C7 R; n7 U+ h* f\" }
复制代码 运行结果- [[ 4.12414349]
5 \+ x$ J! ^9 o- j- W - [ 0.48007329]
! B. } b# E4 R _7 D' D* V; I - [-0.6168482 ]]
$ q: Z2 f; h9 {3 \
复制代码 / t( W, N, n/ L; ~; Q. f
|
zan
|