- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """9 P) P$ `; ?' I/ a! \6 }
- 函数说明:梯度上升算法测试函数
' {7 k4 m3 X1 T& F! g# m* ?
5 U- M# V( O' ^2 u1 h: ^- 求函数f(x) = -x^2 + 4x的极大值7 Q2 L5 U* x* t) p
% F9 `' F8 y, ?\" m6 p- Parameters:
( L; L8 e5 h' w# f' l5 M6 l - 无8 K4 k; f( ^! J! X, v
- Returns:
; S$ P' W2 k1 T$ S. b+ u B - 无4 J! \/ h* u) }! d4 k
- """! f: U. K( D/ D0 K& w3 R1 Y7 g4 C' z
- def Gradient_Ascent_test():
c- X \ S7 G9 S - def f_prime(x_old): #f(x)的导数9 p\" @ r: V+ P7 w! o
- return -2 * x_old + 4
& s o$ V8 t3 S3 N. L - x_old = -1 #初始值,给一个小于x_new的值1 |. u/ m+ I! Y
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始& ?; E# l; u/ a ~
- alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
N5 p' p* V6 C- O+ Y& Z - presision = 0.00000001 #精度,也就是更新阈值
/ F# L. _! x- J9 t! R; t: g - while abs(x_new - x_old) > presision:
9 m- ^- ]) n8 b b\" J - x_old = x_new
/ N ^/ N( P. X9 L( J - x_new = x_old + alpha * f_prime(x_old) #上面提到的公式5 r2 F% F3 g2 ^( Q+ M7 l
- print(x_new) #打印最终求解的极值近似值
4 p* K$ W& y# @; d# M - ! v$ y* i: n8 g- J& j0 j; |
- if __name__ == '__main__':$ T) t/ u* W; J. x% v% c
- Gradient_Ascent_test()
$ h; z0 n; e# k6 m7 M# j! f
复制代码 运行实例:- 1.9999995152798579 F+ F8 y& x6 N' |
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0
& |3 _& H2 R7 d+ p - -1.395634 4.662541 1; _$ D. d0 ?9 [1 Y
- -0.752157 6.538620 0
- }$ i% w; y8 {: P - -1.322371 7.152853 0: l2 m# L3 ^! V1 y% j/ Q
- 0.423363 11.054677 0; x% Y/ I0 s6 J1 R# W8 B1 }, u/ P
- 0.406704 7.067335 1
- O; j\" m' b2 f R' t; w* P - 0.667394 12.741452 0/ u: e. ]/ k4 k) M, ?! c
- -2.460150 6.866805 1
* Z7 T' v* n% z$ l - 0.569411 9.548755 0
* u' r' k [* @( r5 E. D6 W# W) p8 D - -0.026632 10.427743 08 X1 ^ |+ E% c& e# _' m
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt' G1 R, ^- I0 r9 c# }0 Y
- import numpy as np: r4 z) X) T6 r$ O- i3 E6 Y3 m, o
0 a' A( \: G9 S3 H- """/ r3 H4 q8 \$ y/ O9 W9 T: F
- 函数说明:加载数据% ~6 G5 o* x, p3 L& ]7 F, F
' Y u\" W$ a+ q. U9 J\" ?' i1 C- Parameters:
4 s5 S- [% |; n& ?) w5 Z - 无
+ ]! }) G: r( K+ W5 K2 ` - Returns:
) h( V( l D' V- a8 F# l9 t- R, } - dataMat - 数据列表3 } B$ [& L! j& Y
- labelMat - 标签列表
6 q5 [* l# h. d, x7 \9 n - """3 }9 h) O, o) y! s% q
- def loadDataSet():
( s4 t/ B3 k2 K4 d1 W# q3 j7 Y - dataMat = [] #创建数据列表1 P' z4 Z i* n
- labelMat = [] #创建标签列表
6 Q5 S$ T+ H2 d& J8 R( L; L - fr = open('testSet.txt') #打开文件
0 s4 S; }. m! T7 p6 u. Z% C - for line in fr.readlines(): #逐行读取
5 w: g; B0 |) q0 N. o' v Q - lineArr = line.strip().split() #去回车,放入列表
* N1 Y$ M B1 c2 T! V9 }3 t - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
9 K& i4 z# z* \8 {; @$ a - labelMat.append(int(lineArr[2])) #添加标签' L* w; O# C a
- fr.close() #关闭文件( @ @ e1 P* Y4 _, E+ |9 m, ~
- return dataMat, labelMat #返回- x4 q3 G' E5 z7 o g/ {
; T! E8 v% k5 F+ Z- """
. p# r2 x\" }3 u. N\" M/ N. L8 z, n - 函数说明:绘制数据集
, z$ a* X: `' m* _
2 q\" c% M\" |- ]% P5 @) N' d- Parameters:. G6 |+ y3 G2 `1 c. E0 } g Z
- 无
( ]. p, N' V\" f5 ~6 E0 z( K - Returns:
7 ` H5 k; Z! {% l4 l! C1 z - 无
) {8 @% ~, l) J5 ?3 D - """
1 g/ N ?5 y G\" C\" T) b# g5 E - def plotDataSet():/ U- ]. d- R4 s x; @0 V% W# b
- dataMat, labelMat = loadDataSet() #加载数据集
; s! m; M/ c2 D) O6 a; P; n - dataArr = np.array(dataMat) #转换成numpy的array数组
8 {2 C' J5 @\" m; r# l - n = np.shape(dataMat)[0] #数据个数, u# u9 F& v5 i6 V
- xcord1 = []; ycord1 = [] #正样本
/ f\" L' _! ]* N\" w, @\" M8 L - xcord2 = []; ycord2 = [] #负样本0 g- A6 ~2 P9 M) p$ n6 u
- for i in range(n): #根据数据集标签进行分类0 ?( u/ I& G! w6 ]! O2 m
- if int(labelMat[i]) == 1:
0 K( h) f+ M6 }& e# Z8 W - xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本$ C3 D2 i8 D- V% `
- else:+ h! n- D$ w* z( Z
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本
, @+ Q8 X1 x3 K ~7 ? - fig = plt.figure()\" l+ c8 }# r# `$ O3 a
- ax = fig.add_subplot(111) #添加subplot: I4 m1 [7 u% w0 z\" G! R$ d2 G
- ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
- Q2 i& _' _+ N: b# h - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本; ]* [4 H3 K2 q% [ E% p9 C
- plt.title('DataSet') #绘制title
3 H4 l+ J\" \4 I0 C. h$ m7 _% W - plt.xlabel('x'); plt.ylabel('y') #绘制label* f* G* o\" v* s9 \\" C* Q& n: t, ~
- plt.show() #显示
- _$ J! A( F2 D o# N - 3 V) p* i$ g5 P
- if __name__ == '__main__':# G1 x0 Y9 a* w- U% i
- plotDataSet()
# G+ Q5 M/ z% t$ g, U6 P
复制代码
9 e6 K: ^' k6 r W7 H `从上图可以看出数据的分布情况。假设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; u' _9 }2 J# ]( X/ O) n
- $ T7 ?7 M+ g8 J: T2 N: a# J
- """
- O( [. }% G) c( g: E* J9 H - 函数说明:加载数据# o6 z+ j5 u3 C2 {; }
- - `+ }- F' f8 z; G$ z2 l/ N
- Parameters:4 a' v) W) F# O4 U7 q
- 无
0 j# X\" J, R# h. O - Returns:
- y$ _: X7 }/ {# I7 o* ] - dataMat - 数据列表
+ K2 O* `, v9 x. ?8 l - labelMat - 标签列表
4 ]4 M$ P7 v' ]+ } - """, g3 p2 Z' g5 m% W
- def loadDataSet():
- J\" A$ d2 M1 Q9 x2 S - dataMat = [] #创建数据列表+ a. v0 K3 |# Y! b9 H' U$ a+ B
- labelMat = [] #创建标签列表
: O' R% V, ]+ e9 u - fr = open('testSet.txt') #打开文件
9 d+ ^' o' S7 `& n - for line in fr.readlines(): #逐行读取
( K: K* q+ ^ E. y - lineArr = line.strip().split() #去回车,放入列表8 g+ S\" h( ]6 z( ?& E M
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据& O) E4 A% s/ r1 X8 m\" K8 K! L. j
- labelMat.append(int(lineArr[2])) #添加标签
8 r4 Q& p7 C V - fr.close() #关闭文件
5 R8 g% I: x0 o2 j5 d1 Z* [ - return dataMat, labelMat #返回. d/ x& e0 }( ^
- % x* }3 e k7 s7 |6 s$ o C6 @
- """
, @6 ? H6 P' ?4 E0 C; t - 函数说明:sigmoid函数' Z5 K, j- h! l( v
- ( k3 ?$ G9 K6 H/ S4 g3 m
- Parameters:
# H( c: Z. W0 o - inX - 数据4 V* |0 s6 {/ B. p\" O0 M
- Returns:\" D0 z: o; Y s' w% P) ?- O
- sigmoid函数* ]* [ |( R' B3 L' y
- """$ O4 @% z- Q3 e
- def sigmoid(inX):& Z! u/ ?% B! z/ t2 s
- return 1.0 / (1 + np.exp(-inX))
+ [7 G4 a3 A s4 j, h' j - 7 b( I: H/ d5 r* o8 {/ n
- 2 m\" `2 D5 E6 q$ V& _
- """8 u4 ]$ b- a2 W\" U; P
- 函数说明:梯度上升算法; ]7 w4 F' T/ h ]/ j\" G/ c/ K; R
. @6 o# W4 K) @: `( H- Parameters:
9 I& J( n\" g2 }1 d+ e - dataMatIn - 数据集6 n c2 E5 ~* g3 r6 m
- classLabels - 数据标签\" L' G5 F* ]6 H! \+ D0 ~
- Returns:
# o0 F( U3 M N - weights.getA() - 求得的权重数组(最优参数)
( }+ U+ }' N: P3 c4 p\" c5 o1 U8 v - """\" t5 e$ C0 h, ^' G6 c0 ^1 l9 C
- def gradAscent(dataMatIn, classLabels):: w L% b/ N, ?' j; ]5 `9 u
- dataMatrix = np.mat(dataMatIn) #转换成numpy的mat4 n, h) }- V- A( N1 `
- labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置( x) | q' b' \. p& S
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
* C6 [9 c6 F1 V\" i8 m - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。/ [' c2 [\" [3 K9 Y/ {* F
- maxCycles = 500 #最大迭代次数
8 ]8 s$ _$ n* A. p - weights = np.ones((n,1))7 \' K1 T0 Q' E# D8 v
- for k in range(maxCycles):
0 R7 m% ]$ U8 v, A: z2 N3 W- K - h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式% ~! w* U' A b0 F
- error = labelMat - h/ f+ g* ^9 {9 S\" d8 ?
- weights = weights + alpha * dataMatrix.transpose() * error4 ]3 B7 S+ o( V! w4 m0 P$ F* V( |& ?
- return weights.getA() #将矩阵转换为数组,返回权重数组4 |* D\" q' k6 G
- l3 w5 {* }; n3 e7 T! `) P- if __name__ == '__main__':7 H$ k: K\" c0 z2 f+ q$ U# z# |' J) L7 y
- dataMat, labelMat = loadDataSet()
/ C6 `; _0 l: A8 f2 g. T e# w% I3 X - print(gradAscent(dataMat, labelMat))5 ]( g; A, |1 v6 S) Z' G
复制代码 运行结果- [[ 4.12414349]
- q9 ^! n! @2 Z4 t - [ 0.48007329]1 g2 \0 {: t7 ^' l, t
- [-0.6168482 ]]
, ~2 H4 a* Q; d& O
复制代码
" t! [# V l$ ]4 ]5 `- `$ B0 D |
zan
|