- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """
8 l& f; u% `& ^! a- P0 n - 函数说明:梯度上升算法测试函数
: I4 C( o {/ |2 i8 J! e$ g I# \/ P
% R [ d6 B. e4 j3 F& \; |- 求函数f(x) = -x^2 + 4x的极大值
4 }\" `, v1 w- @0 f* u: @\" H( Y
\" B- e7 z( ]6 L4 X, N4 l- Parameters:
5 r/ ^1 Q8 I) X' }+ y; {! I. |+ D - 无* [7 t9 c! @4 k0 ~: |# Y6 B
- Returns:2 {( E* j* Q+ ]! d1 h
- 无7 `+ ^: \( J4 L5 b3 C
- """
2 X8 F, U J- o2 Q5 w2 Z7 K - def Gradient_Ascent_test():2 j2 H, s# Y! m. E0 G; E
- def f_prime(x_old): #f(x)的导数
3 V6 h2 x* h# T - return -2 * x_old + 4
7 w* L' w% d9 X$ J - x_old = -1 #初始值,给一个小于x_new的值, S/ O1 c; |0 w0 p
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始: L' L% {+ \1 x8 w/ Y3 x
- alpha = 0.01 #步长,也就是学习速率,控制更新的幅度* |- {5 c6 A% q! S
- presision = 0.00000001 #精度,也就是更新阈值
3 v3 C0 }3 W |8 r, b- o5 e, U - while abs(x_new - x_old) > presision:, [+ ^) ?) }' J4 k. o
- x_old = x_new
: k1 ]0 q$ c2 l1 z# ?8 X+ A3 T - x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
; C5 k* W6 X- E/ a0 ?' h - print(x_new) #打印最终求解的极值近似值
& G$ d9 q! Q5 D( L2 y - 9 h( y0 n$ N& x* O% d% U5 `- E6 D% e
- if __name__ == '__main__':
& [% U9 `* q i. n# c - Gradient_Ascent_test()
; u4 I: k$ w/ J8 m' c, B* ?- k% b
复制代码 运行实例:- 1.999999515279857+ ]3 l$ r6 W; j3 M4 T d
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0
# y\" ?) c# \- {/ q' A/ z - -1.395634 4.662541 1
0 z0 _% m4 ?: ^& ?1 A& H# J9 d& O' ] - -0.752157 6.538620 0) A2 X* d Z+ e
- -1.322371 7.152853 0
: d+ f( v* e; H: ~6 z7 g! a4 Z7 i5 M5 \! O - 0.423363 11.054677 0: f x3 Q4 M! }\" Y- ^7 F- o* d+ Y
- 0.406704 7.067335 1
, F8 Y% W* F& T* i - 0.667394 12.741452 0 {' O) O {4 S0 z' U
- -2.460150 6.866805 1
+ L+ o$ h6 z; a' L' _+ I6 a9 O! J$ t' A - 0.569411 9.548755 0: A1 B) P. X6 F+ v4 C i$ O
- -0.026632 10.427743 04 M+ s& i; a) h\" m
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt
$ J- R& ], g4 A. \ - import numpy as np; [# |( E* _& ]. b4 ?
+ d* Y; |3 C) x w n+ Y# C- """
0 \! U, X! |5 Z - 函数说明:加载数据6 c, R. N1 ?& W4 T& p& `; `' R
$ r h\" ]. ^( U- ^; s- i& X }4 p- Parameters:. M- G4 M( X7 U3 q A a
- 无; S5 H7 s8 x$ c6 }
- Returns:
( p4 O\" s# v' a* U& S, C - dataMat - 数据列表2 n a8 K! ~2 U Q! L
- labelMat - 标签列表
; d3 O0 {1 T% X* C P0 ~ - """7 y! B0 Y! \: E4 @
- def loadDataSet():
2 L h2 L- p; r2 k9 s - dataMat = [] #创建数据列表7 w7 w\" V3 a7 E5 V7 P% Z3 g1 m! M
- labelMat = [] #创建标签列表6 q W @ N* ~3 b6 |0 X4 u
- fr = open('testSet.txt') #打开文件 / r! w3 { `- A/ @# v1 @
- for line in fr.readlines(): #逐行读取
7 w# [: T2 w# T0 r$ c0 O: h0 o - lineArr = line.strip().split() #去回车,放入列表3 t7 b\" _5 t9 ~6 b5 Z, y
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据# m8 o) K, j- y$ p6 O
- labelMat.append(int(lineArr[2])) #添加标签
4 s$ p. K5 X\" C5 k+ B - fr.close() #关闭文件/ A- o# a( J' h* V
- return dataMat, labelMat #返回3 }. U: G3 n. a* p
- , c4 g, ?2 i# ?% I5 X2 b
- """* q' i- K! N L' J \
- 函数说明:绘制数据集5 V0 V! G i8 G5 q( U- q J
; m- Z: v2 v* C4 n/ B+ z- Parameters:2 u% [* h+ F2 c% V\" ~- f' U
- 无, v9 O6 f! _, {$ V/ [8 H
- Returns:5 m; r I# g; R9 N
- 无
2 r2 y7 q9 g4 h# \/ M& ^* w - """
! n. _! x7 e6 f# {+ v - def plotDataSet():
$ x3 `3 i/ q* q: P) ^0 n% r( @. L4 F - dataMat, labelMat = loadDataSet() #加载数据集
\" ^\" Z. c& W4 p$ Z5 I - dataArr = np.array(dataMat) #转换成numpy的array数组
\" p$ R, ]4 W3 I; j - n = np.shape(dataMat)[0] #数据个数9 |4 j7 U# a& {, ~$ ]+ {9 P, W
- xcord1 = []; ycord1 = [] #正样本
9 z1 G4 p% H; X8 e7 O% Q* ^ - xcord2 = []; ycord2 = [] #负样本
. o9 Z8 H5 X6 Y+ a - for i in range(n): #根据数据集标签进行分类% r5 j: J& P f6 A8 j: o# ?
- if int(labelMat[i]) == 1:
) [! V V# h& `\" B# J - xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
\" p\" g6 y' S2 H$ D - else:5 c, W) v+ Z% }4 {\" O* C
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本6 Y( g& S0 a* x2 u. f/ T0 U
- fig = plt.figure()9 `3 T# X# |8 X6 I
- ax = fig.add_subplot(111) #添加subplot
/ x8 k6 a0 @' p9 k4 m. {1 Q$ M4 G - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
8 t6 ^4 T, l- y9 L8 x) R - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本1 D4 E! v\" Y2 c4 @$ i5 M/ x7 S
- plt.title('DataSet') #绘制title: v) y( I, ^+ Z/ {6 C+ @/ U9 D
- plt.xlabel('x'); plt.ylabel('y') #绘制label- ^- U- A$ B0 n# i
- plt.show() #显示
7 A\" V1 a' W$ m3 X5 {: V( z
* {\" H% x\" I1 X7 ?- if __name__ == '__main__':' O6 m1 v4 R9 a\" |& W# \: e: F) ^3 }9 N, x
- plotDataSet(); C; x5 r9 d- a6 m
复制代码
- X% l1 [6 `% g
从上图可以看出数据的分布情况。假设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; Q& ^6 n0 y. C4 W5 R. g
- ! q e- [# ~: @* Y* k! S5 {2 I
- """
1 s8 M/ E5 P2 P- N3 k7 m - 函数说明:加载数据9 j- v. k% M1 n1 W2 \* D
- \" S6 e8 y) r! j; x, T, O0 q3 t
- Parameters:8 l- U/ g7 [2 ^1 m0 F5 w/ D, I
- 无
8 }( {0 Y1 T5 ^ V: k - Returns:( u) d; B. u+ _7 Q2 `9 A
- dataMat - 数据列表/ g) A% K( w2 ^
- labelMat - 标签列表; @; ?5 `0 W: I4 A5 |7 F
- """4 ] A( D$ g9 G2 ~+ J5 z; [- X/ Q% J
- def loadDataSet():4 w$ _8 J! C$ ~ }* `, F
- dataMat = [] #创建数据列表
6 Y( P& ?$ n4 W* ~) _1 o' w d4 l# F - labelMat = [] #创建标签列表
; v/ d1 E# G1 a - fr = open('testSet.txt') #打开文件
3 u; W3 q v. n+ J k' B$ Q, r. A - for line in fr.readlines(): #逐行读取
% w- Q\" i7 v/ g4 r0 w# j - lineArr = line.strip().split() #去回车,放入列表
\" d/ h. T/ q0 A j* p - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
1 i2 f5 o0 R' t+ ] - labelMat.append(int(lineArr[2])) #添加标签
$ [\" k, C% O% } - fr.close() #关闭文件( w3 V# h; Q8 L f; v; v( ]% e$ }
- return dataMat, labelMat #返回2 z! p& w+ ^$ w( _ q- G
- 1 {$ D\" H, M* X! l- C
- """
9 K$ r# Z# d- _9 _ - 函数说明:sigmoid函数2 x5 A j$ N# |& y/ {/ `
. ^% j3 x4 ^/ X% ~* |, w: B- Parameters:2 U `7 [0 B1 d
- inX - 数据1 i: x) D/ K$ {7 V4 X. N
- Returns:
5 h1 _\" V\" R8 Z6 C - sigmoid函数
\" P) @: m* i2 y( @) w( c9 |# r! i - """
1 I* v3 M& D' F& Y - def sigmoid(inX):
/ r0 S0 U P5 t7 h; N$ W - return 1.0 / (1 + np.exp(-inX))
$ g$ ~# {! {- q& `' C5 `6 S
, c% c- @' Y) H/ W+ C- 7 K( W, x7 u9 Z6 O1 x
- """0 E, J1 O' l8 U$ N, v. a
- 函数说明:梯度上升算法6 {0 b2 H0 m7 E% Y1 s
- , {& M' `5 h4 b! M$ f+ l
- Parameters:: w\" d9 w* O, G
- dataMatIn - 数据集
( I7 C& u' P1 f6 ]. e - classLabels - 数据标签) i. b b. [3 |( J; O
- Returns:
% I4 D6 X) }# H3 T& D9 d - weights.getA() - 求得的权重数组(最优参数)* H8 h4 t, s; V( A; v
- """
4 B8 V8 T$ j* Y/ `3 O - def gradAscent(dataMatIn, classLabels):
3 P8 z( F' x `0 [ - dataMatrix = np.mat(dataMatIn) #转换成numpy的mat2 T9 Q' K6 R# G! k5 c. V
- labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置
! w% A y, q- n3 I+ f - m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
1 r( _: |. h( G\" O - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。. K* h, h9 \6 u8 F& P/ O+ p5 q0 l
- maxCycles = 500 #最大迭代次数
/ T7 O( l6 |1 r& p O7 V% B( x - weights = np.ones((n,1))
- [9 T/ g/ j ?' m9 `1 v - for k in range(maxCycles):& e6 k$ z5 M* c5 S\" H
- h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式. a; j\" m2 P9 ?$ l3 U! Y5 x5 @
- error = labelMat - h9 j3 E$ k0 U2 J) F f% b
- weights = weights + alpha * dataMatrix.transpose() * error
1 g! \2 C+ {- I7 k - return weights.getA() #将矩阵转换为数组,返回权重数组
5 ~/ P5 Q7 z* [& @* Y2 X* Y - , X) J2 W# {) N0 Z8 x
- if __name__ == '__main__':
1 Y, w; E1 G& s ~, t. g - dataMat, labelMat = loadDataSet() : J4 s/ T( e- }
- print(gradAscent(dataMat, labelMat))
( _ M\" _ I5 {$ b; \# C: B
复制代码 运行结果- [[ 4.12414349]6 z' @; d$ X7 j& d! Y\" c0 ]\" t x
- [ 0.48007329]
9 E% {2 Y1 B* {; d) T - [-0.6168482 ]]
' f, k5 A7 G% C3 W8 E\" a0 I
复制代码 ) M' b$ H7 W( t# Y3 M7 T% {
|
zan
|