- 在线时间
- 478 小时
- 最后登录
- 2026-4-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7788 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """
$ D* a# h; ]* }- T* C7 G+ O: h6 `% r - 函数说明:梯度上升算法测试函数
( N8 x: q; \5 ]+ x9 O% Y
: L2 t( \: \5 D+ l' J# O- 求函数f(x) = -x^2 + 4x的极大值
9 I! B6 v( t& J\" C; m6 D
+ T, F; ~- o1 h Y. g0 m# l. o- Parameters:3 P' D$ ^- Q) ~& P9 c1 K
- 无' j8 q7 ^8 H- j/ I9 i
- Returns:
& R& T\" q, E: N. h; B - 无
% B! C, M# z# b, I2 T' s - """
# E j+ E7 D: V2 k4 |6 m1 o. d9 d, a - def Gradient_Ascent_test():
+ s4 G; @! x# U4 k3 n% o2 z - def f_prime(x_old): #f(x)的导数
4 a- e6 n! i* B# C4 A( ~( p - return -2 * x_old + 4* a+ _0 T3 Q& h9 V, j\" o& z
- x_old = -1 #初始值,给一个小于x_new的值
( X; y* k6 `8 u/ t! g% n$ N - x_new = 0 #梯度上升算法初始值,即从(0,0)开始
+ T5 k: W$ t; Q+ Y/ I6 _ - alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
) o, ~+ O' m5 I; {7 L7 @* n3 m - presision = 0.00000001 #精度,也就是更新阈值+ f- Y y; I& J$ T' c
- while abs(x_new - x_old) > presision:* ? X$ }) @; N. M- e6 @2 Q
- x_old = x_new
1 y7 ^& v+ @: P, s9 X5 X# o - x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
7 z! V9 T( f0 G- s1 c, E! w - print(x_new) #打印最终求解的极值近似值( w& P2 D& B/ s) V. w\" o
- 9 B9 h' T3 E8 @
- if __name__ == '__main__':* _+ {9 O4 H\" l- D4 b# }. X, p
- Gradient_Ascent_test()4 e# l4 A9 W1 Z; B% k/ {1 n
复制代码 运行实例:- 1.999999515279857\" ^4 u9 @& O) }' E
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0
5 {+ ^4 n. R& t- s - -1.395634 4.662541 1# }0 M1 _ A3 B. c8 P9 X
- -0.752157 6.538620 0# w$ J# L# t\" j6 w- O1 z* w( a; e
- -1.322371 7.152853 0# K/ R& Y6 M: q, G\" ~3 n
- 0.423363 11.054677 01 C0 i7 J6 L# G! H; q& S8 D
- 0.406704 7.067335 1
Z# [5 G! ^7 m+ k - 0.667394 12.741452 0
1 o1 B4 p0 O3 E5 `2 B\" Q5 @) i - -2.460150 6.866805 1
1 o. o [2 G$ y2 K2 t7 J) X - 0.569411 9.548755 0
4 M) f' s4 ~+ \1 R, E4 N\" K - -0.026632 10.427743 0
7 Y1 T4 m\" j; l
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt
! t& G$ _' X$ p$ y - import numpy as np6 d- G$ ^, D% z( Z\" n6 a' V\" \7 E
- ) I$ [& d7 ~ Z& x
- """# y\" _' Z3 u. t; `1 l
- 函数说明:加载数据5 j- m6 c+ c# S$ E
- 8 _: D6 J; L8 q& ?3 x. S
- Parameters:
$ J8 [! G7 T8 u' \8 ?% \+ i - 无* v3 [: a7 S& L# ]
- Returns:) i% G. C8 S! y, u3 V
- dataMat - 数据列表8 `5 J2 r9 S4 r9 P& e
- labelMat - 标签列表' u. G) m9 S# s+ g8 h$ E
- """1 c! q+ [* P n
- def loadDataSet():) `1 s$ b$ ~6 H- O
- dataMat = [] #创建数据列表1 M\" B; C5 g' `3 N
- labelMat = [] #创建标签列表
' h! h2 E7 q& z* [- F - fr = open('testSet.txt') #打开文件 / h Q# ^\" k8 |8 d @) x
- for line in fr.readlines(): #逐行读取5 l6 {4 b0 m, `) Z
- lineArr = line.strip().split() #去回车,放入列表
{2 P9 p! ~; E9 D! U! N; A7 g6 S, T - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
( Y7 F0 g3 n% @0 f9 q - labelMat.append(int(lineArr[2])) #添加标签5 V+ K+ j/ f F
- fr.close() #关闭文件
& S& {4 }5 ], y# i3 {6 c - return dataMat, labelMat #返回
. y$ I3 a+ S( s' {: I
3 n5 Y& A4 H\" ~1 H& L3 m% W- """
5 D1 ~) H1 q* k* u - 函数说明:绘制数据集
9 {) f. d% [ x0 M3 c - 9 {' {, l6 }% r2 ?- }
- Parameters:
' a, J c7 N& X! D3 U6 G - 无 d3 W+ _& _) f6 B4 j# t
- Returns:& s1 ], Z! ^8 Y8 x/ ~! ~1 w, ?
- 无
8 r$ i) d! E) p- i* h# {; X - """
9 p5 I( ?' \9 F; Y! F - def plotDataSet():( ]+ C# m M6 z& E; ]- s
- dataMat, labelMat = loadDataSet() #加载数据集
) R* d& |! r6 G3 K1 Z8 X( G - dataArr = np.array(dataMat) #转换成numpy的array数组
p6 `\" n( k* i% p& |& y% J9 |- B. @ - n = np.shape(dataMat)[0] #数据个数9 n# t1 J9 G! ?8 _
- xcord1 = []; ycord1 = [] #正样本
) }4 ?& I\" ]/ s - xcord2 = []; ycord2 = [] #负样本
\" U' u. ~* ?5 Q1 V' [+ c - for i in range(n): #根据数据集标签进行分类* ]/ F% B6 ]: j: ]. F0 N0 l
- if int(labelMat[i]) == 1:) F _: X# r+ n1 ]+ P6 f
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
7 r* h- T4 \# x4 M5 p& z& A3 | - else:
& f4 {) n: }( x8 ?/ Q5 Q% p3 B - xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本6 l/ ^) H9 S% w
- fig = plt.figure()
! r( g7 Q9 ^* D8 ~9 Y3 J+ ] - ax = fig.add_subplot(111) #添加subplot
) a3 A8 y3 k! Q+ X) c1 _% L1 b - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
2 o! ]; Y! n, |8 g - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本9 C& D, g& [7 K# v
- plt.title('DataSet') #绘制title! \4 g; P5 S8 K7 A, u( b7 U5 Z
- plt.xlabel('x'); plt.ylabel('y') #绘制label
$ E7 p: K T9 A- A! |$ s - plt.show() #显示
$ L6 q. t; ^\" H1 p1 H( w
: k# k5 O& o$ C* K3 k1 }1 P\" `- if __name__ == '__main__':* V2 Y5 M* m1 Y3 j
- plotDataSet()
& G- h! x# j0 A) g! o2 e3 E' w5 U
复制代码
5 g1 K! Q8 c$ j4 s) a; p% 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
! `+ }( f; \7 H$ X: q - , ^( ?; [( p\" `' {3 N
- """
! Y9 a% }3 V# p+ Q9 ^) b - 函数说明:加载数据
+ X- }9 g8 ]+ r+ J$ g; n. N
) T s7 n; g. |; U- h6 A- Parameters: H! n, J, ?1 T. N, m2 ^
- 无
/ z\" |' N+ N! N2 D$ _6 P - Returns:
2 P$ H* M1 R1 i. \% G7 ^$ ] - dataMat - 数据列表
9 @% p0 K3 v$ z - labelMat - 标签列表* {' i# A- U4 f- y {
- """* ]% E4 x, g8 c9 Z! U) m
- def loadDataSet():
4 C3 L2 H# Y' }7 |' j - dataMat = [] #创建数据列表- D+ H9 \\" Y, L4 ~/ j: h
- labelMat = [] #创建标签列表
! H5 E7 `* j* K9 ~8 V\" m - fr = open('testSet.txt') #打开文件
1 h3 B0 }) K3 Z0 }$ u& ^- k - for line in fr.readlines(): #逐行读取0 ]# y! v# N Y* F
- lineArr = line.strip().split() #去回车,放入列表- M- Z\" Y8 d\" b! O: I
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据 H$ F( p\" b0 V' R* C: O
- labelMat.append(int(lineArr[2])) #添加标签2 s9 T$ m5 R; f6 u! a2 D) z( o) X. x
- fr.close() #关闭文件
. t. b8 M( P# b4 b - return dataMat, labelMat #返回
; y# x$ Z% h! p! v - * D/ Z$ C$ @. q0 T\" G
- """8 G# d8 c* }9 @4 R
- 函数说明:sigmoid函数
8 u4 g0 e g0 ]
* n- f& L) s% ^$ R9 H5 X; Y4 \- Parameters:; O! q8 S* G. m! g4 G8 e
- inX - 数据
' C\" p9 E0 u/ B$ G7 k) R - Returns:
- i; K' j7 `; m; a3 k - sigmoid函数! A\" A5 e# w1 ] X; i0 j
- """, N7 r# w% Q# d! Z: ^7 K/ b
- def sigmoid(inX):
3 E [' i0 H: q. W. T - return 1.0 / (1 + np.exp(-inX))( {1 c8 U z e6 B
- * O; P- l! V) Q- x
0 L( B% C3 C m8 f' ]/ j4 D- """: ]. v1 J Y2 J% f5 |4 n; {
- 函数说明:梯度上升算法% ]' a& E, Q: b; x) i
* _7 N* a. l* l+ i- Parameters:
2 e ~) e E$ L, `' T& ^* j - dataMatIn - 数据集
. s3 s2 i& k+ |/ Z - classLabels - 数据标签/ K\" e1 w+ Q' ^% y# m4 b: L
- Returns:6 o% D- W4 c; E% b1 L
- weights.getA() - 求得的权重数组(最优参数)
3 {0 B2 E8 b/ t - """
6 X- I0 e: I& W( L e: o - def gradAscent(dataMatIn, classLabels):- A0 B+ s. Q7 f
- dataMatrix = np.mat(dataMatIn) #转换成numpy的mat, L. w, h! U5 e\" Z
- labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置+ ^# O) D8 s3 ^! Z- K/ \
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
, T h8 T- l# }5 p - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。+ ?) \) B! \1 z; d- t) j8 O
- maxCycles = 500 #最大迭代次数
' z$ ^! R7 ]/ e/ ~1 s - weights = np.ones((n,1))- z- d& l, T! p
- for k in range(maxCycles):
- _8 X4 h9 b1 [) ]1 T! Y2 E4 P) W - h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式
- X7 {& R- G0 X* O1 Q' c - error = labelMat - h
* V3 E/ A$ l0 T1 [ - weights = weights + alpha * dataMatrix.transpose() * error
& b7 x( F0 }5 C n) q: z - return weights.getA() #将矩阵转换为数组,返回权重数组
) D% b7 y9 M& C - - m: y/ Y\" h7 A5 Q* l
- if __name__ == '__main__':! M4 E; p% B& x6 M V
- dataMat, labelMat = loadDataSet() 3 r) A; _1 Q; b! Y
- print(gradAscent(dataMat, labelMat))
4 d% C- n! @: ]& p5 ?* c; R
复制代码 运行结果- [[ 4.12414349]
a1 S6 ^! p\" @4 m; ? ` - [ 0.48007329]
; h7 l1 ~1 R1 Y$ f8 o* O5 V4 ` - [-0.6168482 ]]
\" ~\" a$ I) }% _. x# Q
复制代码
6 W8 ~" g( K) H/ W- j- B! |* b+ | |
zan
|