- 在线时间
- 479 小时
- 最后登录
- 2026-5-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7813 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2931
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1173
- 主题
- 1188
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """
5 I# T! W% ]( C: p- n' y+ n - 函数说明:梯度上升算法测试函数
6 m# B6 j- S2 s4 K8 U - 2 i# I: l\" i% R
- 求函数f(x) = -x^2 + 4x的极大值
E2 ~ L' _ g; {7 [# F1 s5 j
- [- S! A; u# v f! W8 X5 K- Parameters:
* T: L7 V( C8 U+ J6 i I - 无
' u1 j3 o( ^/ r - Returns:
, x6 v, g, k/ F0 L - 无
: k7 m8 |( m2 r; M1 R- N - """\" E1 g8 a* i+ y- O
- def Gradient_Ascent_test():; J+ Y6 t' b. e- V. U% ^8 P
- def f_prime(x_old): #f(x)的导数
# H! a0 {1 ^9 H& A7 M& E - return -2 * x_old + 4+ O3 E4 v p, s# T: D% v
- x_old = -1 #初始值,给一个小于x_new的值6 U. l, C/ ^, I( m\" E
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始1 `) c+ Z% t! V h4 L7 N
- alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
6 I; Q7 d, }& T* w8 L7 ]. Z% ~ - presision = 0.00000001 #精度,也就是更新阈值* h/ h\" a# K1 D. s
- while abs(x_new - x_old) > presision:- t( |7 K6 P- S; b# `4 H. g# b8 f
- x_old = x_new) V4 T: T, b1 u* y
- x_new = x_old + alpha * f_prime(x_old) #上面提到的公式* Y% p4 i1 ^( q3 [) f\" O U
- print(x_new) #打印最终求解的极值近似值* s$ p' j9 U5 c- Y
$ @\" h5 f. k3 f8 K\" H8 b- if __name__ == '__main__':5 Q w1 I& e( o# Z# k9 z' B7 K3 Y& K; R7 o
- Gradient_Ascent_test()+ {2 g* L0 X0 |\" n1 ~
复制代码 运行实例:- 1.999999515279857
- \% H) g, d# t) z$ q+ D
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 06 ?3 } ^8 K2 M& r9 z
- -1.395634 4.662541 14 `; m* C) w5 _' M
- -0.752157 6.538620 03 L* `- d- Y) Y6 B( r\" G/ j
- -1.322371 7.152853 0/ B, H/ ~3 y& m/ r
- 0.423363 11.054677 0
, v: n$ n& V/ [ y1 h+ ]; B - 0.406704 7.067335 1
/ x0 \8 ^! O- c8 l! a5 q - 0.667394 12.741452 0
; i& Z9 B0 w! m# j$ L. i# A0 f& L) @ - -2.460150 6.866805 1
5 e- P; @( T6 Z: ` - 0.569411 9.548755 0
2 k\" H* o& C, A - -0.026632 10.427743 0( w\" l% ^: {, H& S0 S
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt- U' }$ o& y1 a8 m/ Y: \4 f
- import numpy as np
\" e; j8 O+ z) n' ~# j- b* F6 x; `6 m - y8 A; |3 T# Q% O: B* P
- """
\" V, ]+ v$ V. L - 函数说明:加载数据
0 V8 M' [ Z& b. i$ S& G
) p, e3 e$ x+ h- a- Parameters:7 m1 X& j5 `1 Y( C9 m$ n* B- L
- 无
\" W! J2 g/ s; L# r9 M1 L - Returns:2 q+ D; P: F0 o0 ?. O9 U: C
- dataMat - 数据列表
s% T0 \) N! d\" S8 x6 @. y - labelMat - 标签列表
$ F: M* E9 T) a: s z0 _8 _ - """
7 ^- F7 ^1 y* J - def loadDataSet():# a! l6 S0 I9 W& V+ D# j' y
- dataMat = [] #创建数据列表
1 B* `0 B6 w1 B/ r5 U# O - labelMat = [] #创建标签列表
- e' Z. T5 Q3 ~ - fr = open('testSet.txt') #打开文件 2 Z* B9 A; ^! |7 R2 p
- for line in fr.readlines(): #逐行读取# ^% D& e% F. s\" i$ G* |
- lineArr = line.strip().split() #去回车,放入列表7 i# n0 t7 D1 c4 I
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据% q% ^. p8 p+ D& o
- labelMat.append(int(lineArr[2])) #添加标签
! _% `! l2 M7 f2 P2 c - fr.close() #关闭文件
$ {' | C$ K7 z - return dataMat, labelMat #返回
( G! ^' I# P: u# i& P1 Y, i4 W - & e0 G0 t3 C% P) N0 _, X
- """
! D/ m4 @$ y; z4 f5 q6 \ - 函数说明:绘制数据集
7 R9 J3 E2 s# \ N+ C! ~5 e4 R; n
0 `9 B @# h; j! l\" [% H! T- Parameters:
3 O* V9 \: s- H2 E8 _7 R - 无
1 ]- D7 _8 R$ H1 ~+ _ - Returns:! D/ k% L) } Q3 Z\" U% i1 i8 ?- B
- 无
2 O4 M: K- Q3 W& M - """; b* m [9 k& X$ ~! F0 i. p
- def plotDataSet():
\" |( L* N$ a( ?# V r/ J- G9 S2 Q - dataMat, labelMat = loadDataSet() #加载数据集
\" [1 D5 v/ Z8 O* d9 ]/ W& o+ t - dataArr = np.array(dataMat) #转换成numpy的array数组
) W& g5 M/ q: J$ p - n = np.shape(dataMat)[0] #数据个数
8 U2 Z$ ]' [5 B8 K/ r - xcord1 = []; ycord1 = [] #正样本0 ~7 ]6 s, h* w: M3 y; a8 q' F$ q
- xcord2 = []; ycord2 = [] #负样本
2 C0 Y5 u& P; `' o | - for i in range(n): #根据数据集标签进行分类
. D* f3 `& q$ v- @ - if int(labelMat[i]) == 1:5 C0 U! w% s6 d7 @9 Q7 y2 ]0 ~. r% t
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本& w1 H% j+ c: _1 u6 e0 n1 {
- else:
* ~1 l$ ]3 y4 E1 s, h - xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本
% V) r& B3 }% h1 Q) g - fig = plt.figure(). d; E9 a/ \& _3 l
- ax = fig.add_subplot(111) #添加subplot
1 C# O) o3 F5 ~6 @\" E - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
' ]- R7 B9 w6 ]/ U$ t3 j+ W8 E( v - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
, s Q* @% f7 d - plt.title('DataSet') #绘制title
) m7 Q' t9 h8 J/ J& n3 Q- _1 j7 N - plt.xlabel('x'); plt.ylabel('y') #绘制label0 g0 F% `/ F' z
- plt.show() #显示\" o- f5 k3 d$ h
- + d9 j* ~4 c2 d0 A. w
- if __name__ == '__main__':
0 {: [6 y& V4 U; `2 ~; K N7 G n; v - plotDataSet()
- A& z2 C+ q9 ^) Z& y$ @
复制代码
% A. I4 [( H+ A5 V( O从上图可以看出数据的分布情况。假设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
# {. t. T& a5 I8 d - + X: [* n3 e+ R: i$ \: f1 E
- """4 W0 j6 Q5 @! R7 w! c
- 函数说明:加载数据. F' x$ g, ~' l1 B1 P' v' P
2 W% X( \' B3 @6 c5 [- Parameters:/ ~3 G' P& P: j3 q
- 无
1 R/ v' o, E9 } - Returns:# w# \( T+ h, ?% V( l- g- M) |
- dataMat - 数据列表
/ s: r+ q$ G, Z$ N( O0 W - labelMat - 标签列表& S# J; r# X1 E8 b- q! Q3 K1 e
- """
/ R( c0 o& O$ d. r- g - def loadDataSet():2 m\" M7 a- | \. G5 p9 ~+ ^
- dataMat = [] #创建数据列表& S- w1 k+ G8 K1 e, n8 P$ r
- labelMat = [] #创建标签列表1 { f. J! R( B/ m: |' O9 m b
- fr = open('testSet.txt') #打开文件 ) d8 X( Q. ?! S+ s
- for line in fr.readlines(): #逐行读取
% K4 m$ [+ n/ Y3 P% O( Z - lineArr = line.strip().split() #去回车,放入列表
5 P' p8 V. n9 T+ x1 G. w1 p0 X - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
8 a6 ~3 W, A, l8 W: h5 g& x% M - labelMat.append(int(lineArr[2])) #添加标签
0 N6 B9 n2 _% N- w' i) f\" @7 [ - fr.close() #关闭文件
, k: e4 Q6 `\" n9 l7 v4 G/ s - return dataMat, labelMat #返回3 u\" M9 i H& U; H/ {3 u
- # v) ]. _/ x; Q! J$ S% `& R
- """
/ J$ p( w$ p: x - 函数说明:sigmoid函数
7 O4 l+ K+ L1 @7 ~3 c
6 ^# X/ @6 l. D3 G; s/ ?- Parameters:; H3 l3 h/ \7 @- V
- inX - 数据, l0 U. r, ^& r0 {) t
- Returns:
6 F+ b/ R4 Y- Z) ^2 O - sigmoid函数
, c% X8 d9 K9 T. a& u' d( F - """
% U3 e5 g1 u\" `7 ]' ^7 ` - def sigmoid(inX):' Q0 i3 Y( o: S
- return 1.0 / (1 + np.exp(-inX)), @$ n* J9 ^# T) o
- * ]9 s% J, \' Q6 S) @9 q2 D! a
- N* C; D3 }! w, b* h1 A- """
; `. ^6 C! J$ p% C) Z2 t - 函数说明:梯度上升算法/ B, ]: m4 p2 t3 M) N- b- H Q1 G
+ O( [\" `# _$ g0 o3 @* }1 M- Parameters:
% q\" a4 x) q3 T4 W O G - dataMatIn - 数据集
% [& D% P/ E! g - classLabels - 数据标签
) T3 i$ P, c: B - Returns:3 ^6 _* g+ f; Z9 _% `+ E
- weights.getA() - 求得的权重数组(最优参数)
9 B; \0 T3 d4 k, t* ~3 f, ^ - """
! u# h- ?& a( E& n - def gradAscent(dataMatIn, classLabels):- E+ L8 T) O6 r8 {; X; M& b
- dataMatrix = np.mat(dataMatIn) #转换成numpy的mat% n) O0 }1 E9 _' g8 e\" U
- labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置6 F5 p4 V4 p4 q- q7 ~( Y/ q+ j- q
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。% _3 Y! s$ _0 F
- alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。2 x/ f+ I& k/ x5 M8 f' x# f
- maxCycles = 500 #最大迭代次数, n; \+ d2 J6 Q ]
- weights = np.ones((n,1))4 d2 c8 T% j8 j% z' [4 W
- for k in range(maxCycles):
! Y. \! e* E1 n( N- c. B# K - h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式
\" p* A2 p\" C7 W5 c - error = labelMat - h! e2 t& V7 ~' o( r! |
- weights = weights + alpha * dataMatrix.transpose() * error' e: V K, O9 a2 Z5 a
- return weights.getA() #将矩阵转换为数组,返回权重数组2 B) Q: p, d8 v$ b+ Z
8 k8 I0 v( d V\" h3 F- if __name__ == '__main__':
7 ]\" o7 x! _* b' F - dataMat, labelMat = loadDataSet()
$ v6 ^$ \# s2 R\" t. x# | - print(gradAscent(dataMat, labelMat)). p Q! |! Z; K+ Q
复制代码 运行结果- [[ 4.12414349]
8 w+ l+ T v: e% }3 s8 o - [ 0.48007329]
3 b\" b D |! N# @: S. d5 u - [-0.6168482 ]]% d/ H1 f) p w
复制代码
" F q3 |/ I" |+ e# H |
zan
|