- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """
% t% w. D6 d\" R3 p0 @ - 函数说明:梯度上升算法测试函数\" O\" t+ D- L! r# `8 |4 K1 W! p
% z8 \3 l9 T7 V p2 k) w* Y- 求函数f(x) = -x^2 + 4x的极大值# L8 ~- Y* j& N4 r5 @: `% A* T
- 2 `6 Q2 D+ z3 ~! q2 o/ s6 f
- Parameters:
1 V) C* P8 n9 ?7 c - 无
& k. ~1 e; w$ D! W5 L4 Z5 I - Returns:, l( z- H: [3 B6 j7 ^# I5 A
- 无4 P; E+ X6 I2 ^4 e, E' f9 G- F
- """
/ \3 F0 e; i( L3 e/ x+ \ - def Gradient_Ascent_test():
& k5 [4 t( j1 t* Z/ b - def f_prime(x_old): #f(x)的导数
4 Q- h: ~$ Z6 G5 {/ h* F- D4 D5 p - return -2 * x_old + 4
2 o- P( e9 q# K9 O - x_old = -1 #初始值,给一个小于x_new的值( n\" _\" d) J\" s7 r
- x_new = 0 #梯度上升算法初始值,即从(0,0)开始- L# m( y! Y1 [3 c3 V$ o
- alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
# U# g# {/ L# N2 o/ o - presision = 0.00000001 #精度,也就是更新阈值- W& z6 H1 r6 \9 Q' T
- while abs(x_new - x_old) > presision:
* Y$ N\" \! \+ Y7 r - x_old = x_new0 B% Y\" q2 A) J
- x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
; b! D# t& i+ G3 v/ y - print(x_new) #打印最终求解的极值近似值
. C, i3 t& J8 S\" \2 V
( u$ h. B& g [- if __name__ == '__main__':% J z\" j, a4 G$ L
- Gradient_Ascent_test(). {7 c\" p3 E6 {! P
复制代码 运行实例:- 1.999999515279857
a: l- i' s+ j; U- F
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 07 I$ E, J6 X- @: A; {4 c
- -1.395634 4.662541 1. ?) M* Q\" ^1 h! q
- -0.752157 6.538620 0
6 F% q/ Z6 x; b, c - -1.322371 7.152853 0: {& G$ u( B+ v( W; v6 x+ P
- 0.423363 11.054677 0
6 a% n9 Z( ?\" ^8 S |! J6 ~ - 0.406704 7.067335 1
4 c\" e( w* w5 e\" A* K/ } - 0.667394 12.741452 0; x' r2 Y\" A4 U$ j8 \
- -2.460150 6.866805 1
A; v2 Z7 D3 i/ V# F4 r - 0.569411 9.548755 0
$ j( F% N3 b# Q$ D# b - -0.026632 10.427743 0
2 \* | C0 k P0 d4 k3 C& M
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt
! w1 `# |. I$ o- s - import numpy as np0 B- l; Q. V+ n# f3 r n7 W\" A6 A
: P6 z6 X( [# @2 U- u) ^5 H6 D- """
: |( M* ?1 o9 a6 `! W) q* S - 函数说明:加载数据2 B$ V1 ?1 d3 t8 V( g
- $ c& G# s1 a$ j4 [3 s
- Parameters:
! @: Z* B% P; d0 C( o - 无
: U' L. P* E @- X% H - Returns:* z2 e& Z* W A/ w\" O0 Z; W
- dataMat - 数据列表7 [& H, k0 U2 T/ N! H5 N' K6 p
- labelMat - 标签列表, V5 n! o6 f# F3 x* `
- """( [4 ?+ t4 f% P: H5 I% |
- def loadDataSet():
# a$ _9 d0 o3 R - dataMat = [] #创建数据列表
$ l5 [- D0 A `6 ?( X+ l7 N* b - labelMat = [] #创建标签列表
6 }$ m0 ?' T* I7 a/ T0 Y* q1 ] - fr = open('testSet.txt') #打开文件 , ~* [+ Y* u, p1 R
- for line in fr.readlines(): #逐行读取
9 p2 ]9 T' r, c* C! \\" e - lineArr = line.strip().split() #去回车,放入列表
1 Y Z) p9 f. `, t) ~5 z. ` - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据7 a/ Q( {# N7 X+ r: F7 \' t
- labelMat.append(int(lineArr[2])) #添加标签
8 i8 R4 K' `) z. e7 ~ P- g - fr.close() #关闭文件( j, l1 J) b1 _- W- _: n$ X
- return dataMat, labelMat #返回! i% c) j. Z. ]6 A! J
- \" P\" a1 T* \$ _2 V+ F
- """. i0 O3 p) q+ E) c1 {
- 函数说明:绘制数据集
6 E2 m1 C+ F1 J+ Y6 I5 e7 j
1 V! J/ w- d. _# o y- Parameters:
: d; ~4 c5 F# L - 无# s/ S- E% o) S3 i5 m( W9 ?5 S& y
- Returns:
5 Y/ b3 T, k3 ~& e, P; `3 L - 无
: E- X, m ]( E4 ? - """
! f5 [7 P4 ]2 ?7 ]% [ - def plotDataSet():
# D! @& l# [- N# C& z0 N0 z( I* a - dataMat, labelMat = loadDataSet() #加载数据集0 W4 W8 m8 s, [: e: z
- dataArr = np.array(dataMat) #转换成numpy的array数组
$ k! {7 U* D* Y1 o7 q - n = np.shape(dataMat)[0] #数据个数4 d# D2 X9 Q0 @3 u/ D6 o1 n
- xcord1 = []; ycord1 = [] #正样本
& D$ x4 H$ V% S3 _ - xcord2 = []; ycord2 = [] #负样本
) z* `8 U1 S. A5 c7 F8 q\" N - for i in range(n): #根据数据集标签进行分类
8 e; U3 W\" r9 f$ H. O' W - if int(labelMat[i]) == 1:$ u# P# ?( ~4 [7 \4 |% \+ V
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本0 U: G1 ]* W& z& B; {! Y; h
- else:\" X6 Y8 D9 y! [. w B5 o$ T
- xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本, j/ [* C\" W1 {; v2 I\" Y
- fig = plt.figure()5 E* e1 a% x8 @$ c
- ax = fig.add_subplot(111) #添加subplot
7 p/ K L6 T. x% G+ g- A- h: j - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本5 n1 Q' h1 r6 v1 }3 l
- ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
/ [. A4 e8 y1 \, z0 b5 @\" q; q - plt.title('DataSet') #绘制title
\" ^: S+ _! J* `( n+ v - plt.xlabel('x'); plt.ylabel('y') #绘制label
8 s; n/ {. l; @: U - plt.show() #显示
( }4 b1 q; J+ p; y; ?
9 w( s/ I: ~\" P: c9 u5 c: e- if __name__ == '__main__':: s4 R# ]\" `2 M) e
- plotDataSet()
! D) N4 b; ?# \$ n) m3 Z
复制代码
( k1 N" l6 N- }5 B2 a7 L从上图可以看出数据的分布情况。假设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
$ R, E. Z! I) s) y - \" N, x) ]6 r' D; |. g
- """' x% a1 Q, p\" v1 M1 U# t# l P
- 函数说明:加载数据& K/ d2 K! J9 I: i' U9 t* I
/ K3 R( C+ Y$ u- Parameters:' g6 O0 w, z p/ W2 J+ \9 |8 M$ e% p
- 无( f4 J1 q$ `\" B\" G! K8 V, M* T. P
- Returns:
Z. \. V8 n! Y - dataMat - 数据列表$ h( P0 ? A, L. x
- labelMat - 标签列表- b& ?7 J/ I. I7 Z! ~8 F
- """, Y2 t( s* e$ @& p( Q
- def loadDataSet():
1 \3 R E3 c# ] - dataMat = [] #创建数据列表
( F4 E7 m9 c8 v8 _6 k# U, ^( k - labelMat = [] #创建标签列表3 e h/ `: w; q, ?
- fr = open('testSet.txt') #打开文件
) n0 O# b3 B1 J' _0 E4 S5 m3 U Q: k - for line in fr.readlines(): #逐行读取$ y, A. j9 [% ?5 ?6 w\" F
- lineArr = line.strip().split() #去回车,放入列表
4 t2 E1 J( L. W2 t- _9 C4 u - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
7 C( |# b4 G; ~ - labelMat.append(int(lineArr[2])) #添加标签\" g+ X* |% q4 r4 M5 x& U L
- fr.close() #关闭文件* _* w3 `* l5 }; D3 k- P2 K* T% ^8 g
- return dataMat, labelMat #返回
/ @: d/ L5 F- p - $ B/ C( m& h% `: A/ e$ W' ^
- """
9 r- d w9 Z' M$ t - 函数说明:sigmoid函数\" r( i3 t6 E0 c8 w/ B* C
6 f. H\" @( X* H9 L1 Z- Parameters:. t& F! P$ |$ r\" U3 D, O# R1 _
- inX - 数据' i, v3 Z) L* O$ W
- Returns:# g- y* L+ N$ i
- sigmoid函数
8 z1 m7 u. a% k7 a - """
* Z! e# T* Y* t x+ S) } - def sigmoid(inX):/ W( x5 [ R7 S3 X* _5 ^; { j
- return 1.0 / (1 + np.exp(-inX))+ r8 d. J C! Z4 T5 H
6 A' v0 k4 `2 H, F' `# F\" @- 1 o+ f6 R) ~+ @1 o\" ?
- """, N$ b( E# Z\" J3 O9 K2 y
- 函数说明:梯度上升算法
2 z( K4 Q& z4 [
9 o$ x8 r8 r6 o\" o4 X: x2 x/ `- Parameters:
. t6 Q4 p6 }$ Z# R2 H5 L( ^) z - dataMatIn - 数据集
; f9 [- s- O9 M! D Q, U% E7 i - classLabels - 数据标签. }' {+ Z% E) v8 k2 |) s
- Returns:
/ N- \2 O9 _, u; _' w - weights.getA() - 求得的权重数组(最优参数)* s- l( E8 Y5 ~+ @0 k
- """
/ X* T& s s9 X2 H - def gradAscent(dataMatIn, classLabels):. L$ g$ K U2 J
- dataMatrix = np.mat(dataMatIn) #转换成numpy的mat. x5 {/ g) O6 n. n4 w0 h: l
- labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置# Y* k7 B, m! g7 I$ p
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
# O, Z6 ~+ k& G1 g, P* P' n6 E - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。: t& `# A$ ^9 C b8 Q( s% x/ h
- maxCycles = 500 #最大迭代次数2 O4 w H4 O D. Z4 {
- weights = np.ones((n,1))6 Y) B7 j- t) f7 z; A2 N- t/ f% Y
- for k in range(maxCycles):/ d7 e8 r\" Q: \. `( J. z
- h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式
4 D5 }- ]* S; A/ t+ ?* P: t - error = labelMat - h
, n9 B, Q* t! Q7 x6 e7 x4 p. v - weights = weights + alpha * dataMatrix.transpose() * error. X8 E1 `$ ], ~3 ^# P8 b
- return weights.getA() #将矩阵转换为数组,返回权重数组
8 |% I. ^8 \, o
) |$ Y& y, x, x+ {: K- if __name__ == '__main__':
9 A$ j3 W. o0 \( w2 v\" F3 y5 c - dataMat, labelMat = loadDataSet() # d- F: R* E9 x/ T0 v3 Y
- print(gradAscent(dataMat, labelMat))6 O2 j' U1 v* D\" ] c' r6 f; ~
复制代码 运行结果- [[ 4.12414349]
; [$ p; S# S6 ^ - [ 0.48007329]
- o8 a; ^9 u3 {6 j9 t - [-0.6168482 ]]4 c, `! B' f! L; H6 p0 ^: g
复制代码
" s& S. Q. A; P: i2 _" Z |
zan
|