- 在线时间
- 472 小时
- 最后登录
- 2025-9-5
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7679 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2884
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1161
- 主题
- 1176
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """1 P& t/ l- l) E8 K1 ?! `3 L# g
- 函数说明:梯度上升算法测试函数
$ I% B& m) M( O9 u* E% U& R
0 p3 F: G0 T; C- 求函数f(x) = -x^2 + 4x的极大值+ J' a7 g$ }. W% }6 r( s( u' j
! c1 [, f# \% O2 i+ i- Parameters:
\" W9 J3 _+ Q1 h$ ~7 @ - 无: I s. u* m2 k' L5 E\" `! z\" n
- Returns:
3 u) ]1 \5 y' Y& `2 [9 y - 无
6 B\" H+ l9 l: e5 O' ? - """- B8 G! V\" W |4 N
- def Gradient_Ascent_test():
5 K4 @4 C( C9 T+ {# j1 x* Q - def f_prime(x_old): #f(x)的导数
6 }; t4 T# p2 B+ ^) S+ D; k5 r5 r - return -2 * x_old + 4
A& w( K/ ~8 E$ I* Q - x_old = -1 #初始值,给一个小于x_new的值
+ _& x! R) A' Z% `5 ~/ T5 F9 f - x_new = 0 #梯度上升算法初始值,即从(0,0)开始
- m3 m; ?$ P* o9 y8 I. ` - alpha = 0.01 #步长,也就是学习速率,控制更新的幅度- Q\" ^% n3 t: t0 X% \
- presision = 0.00000001 #精度,也就是更新阈值3 B/ l. [0 b: p S2 h! @
- while abs(x_new - x_old) > presision:
0 R1 @) A9 P2 Z9 K: ] - x_old = x_new( h. ]1 n( o# C+ b! Z
- x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
C- V( p, |\" F! b2 m - print(x_new) #打印最终求解的极值近似值
\" j* u7 B7 z4 m( `9 g4 [5 K0 l7 x
# K: j2 w! _8 e# H% Z- if __name__ == '__main__':! p/ A; o: j3 `4 |% M' L; X% t
- Gradient_Ascent_test()
, I/ j\" O6 E( b& v! n& J! w
复制代码 运行实例:- 1.9999995152798572 j7 x! r9 [3 H* `- J& d
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 0
\" `6 Y3 k3 H7 K) p- c - -1.395634 4.662541 1
5 @. n( n$ k& R& t6 w - -0.752157 6.538620 0
0 d0 R% T; ]. K/ F' W3 `2 d - -1.322371 7.152853 0
- \; l- `+ a7 E ~. P9 w+ G1 U - 0.423363 11.054677 0
\" p- _5 P X0 U( f* d\" G - 0.406704 7.067335 1
- A; ~3 |9 z' S0 T5 N. w+ ~ - 0.667394 12.741452 0
f3 s/ h3 C( j. P$ L z- Z) ?5 ~5 j - -2.460150 6.866805 1
! H0 j; t$ o, L - 0.569411 9.548755 0
5 t/ G* |* E; g8 L\" N# V/ |6 R9 G - -0.026632 10.427743 01 ? } _+ D! x
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt
, ?) x& ]4 ~ k - import numpy as np
4 ^/ |& O9 v' X4 I\" i
5 r6 q# g: o* A/ s2 O+ T- """
5 f( }- r/ I0 p( ^) _ - 函数说明:加载数据
* P0 `1 c# I* P2 h+ \
3 ?( M* c1 F$ `\" v- Parameters:
5 u1 U' v4 j6 K$ x9 ~; b k - 无
+ e# r, t. Z& J- y( g5 @ - Returns:5 G) N3 ?: s\" V# |6 J: u# f
- dataMat - 数据列表
* z# i7 _: U5 X. \* P - labelMat - 标签列表
4 s. @1 e6 I- r - """
$ W( h. U1 C$ [ - def loadDataSet():( k- c) }5 W0 B( g7 |' b( J
- dataMat = [] #创建数据列表 {\" Y$ o+ P# n( {* A
- labelMat = [] #创建标签列表- h' J, U8 V2 n; V# T7 o6 ^ v- q
- fr = open('testSet.txt') #打开文件
) x6 l$ D2 A, P1 v* Q - for line in fr.readlines(): #逐行读取; z\" R: _) {1 i$ M/ }
- lineArr = line.strip().split() #去回车,放入列表- Z* |\" T* g5 D/ u# {0 [
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
$ L, E9 R# |* @# _, O - labelMat.append(int(lineArr[2])) #添加标签
# q, d3 K2 l! C, ^! K - fr.close() #关闭文件
T4 Z! p1 i5 r7 F& ?+ ?5 ~+ R - return dataMat, labelMat #返回
2 W+ x; l6 l7 Y& F) C1 G% m8 r# I - 3 C) E/ T* a/ R1 [( ^- T
- """
- l( C0 X( Y3 q4 [# H - 函数说明:绘制数据集
+ w3 C# v' ^# w9 N8 v - 3 ^8 B7 d3 z5 p4 H% J5 Y5 c
- Parameters:
$ Y1 q. w; }: a8 l, ]+ m - 无
* v) N; `3 f/ z& F8 b: M: X - Returns:( w7 k2 D M) a! I, N# I9 g
- 无
' U$ J9 L2 U* [: r; x - """ X+ e2 F+ a$ [; u\" b
- def plotDataSet():
/ U. Q. w4 Y: b g* S6 f - dataMat, labelMat = loadDataSet() #加载数据集
/ b* ^+ }8 p! x9 }. M1 x; p0 |$ V: j - dataArr = np.array(dataMat) #转换成numpy的array数组; n, F& E' W\" O
- n = np.shape(dataMat)[0] #数据个数
7 ?; k2 {. y% t' L/ a - xcord1 = []; ycord1 = [] #正样本
( d4 k0 U\" l* r2 E; `- i. U# P - xcord2 = []; ycord2 = [] #负样本% a3 F/ o# \$ L
- for i in range(n): #根据数据集标签进行分类\" @4 K0 w9 R+ T8 S
- if int(labelMat[i]) == 1:
! |! W- J4 b3 Z; ?9 v3 H9 q - xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
: X: {+ x8 W' s3 r! ~: t$ c. c7 O - else:
+ E# x: W7 ]3 B - xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本
+ o; S+ q9 m( C, \ - fig = plt.figure()
! C7 c$ I\" d# i. {9 z, ~2 N3 ~, d - ax = fig.add_subplot(111) #添加subplot
\" A# g! H' _- C- \; c0 G5 X6 M - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
- C+ K; A# G$ ^ z$ @, i6 b - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
, @! Y8 ~8 c+ z - plt.title('DataSet') #绘制title
8 o: p7 x; {9 g7 |6 W: J - plt.xlabel('x'); plt.ylabel('y') #绘制label
. ]2 U5 v [6 ^ - plt.show() #显示, A* I, R( n1 [- V
- $ W! m4 S& `# o4 L\" Q2 K6 D
- if __name__ == '__main__':( A& {/ f- b# r; R
- plotDataSet()
/ J5 H H0 n$ Z0 U
复制代码
* T5 D/ `* G/ c5 s0 `从上图可以看出数据的分布情况。假设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) e7 j3 ^1 k: o0 ~
- 2 F% y: o, n3 W# [$ Y+ [
- """2 ~) K2 c' T2 d6 P3 c+ _+ u
- 函数说明:加载数据
( r# h\" {1 }1 W$ i# y# V! {7 b - / u3 ?6 w, F2 W X' j2 O9 o
- Parameters:! b( B: |+ ]1 G) \( f
- 无+ F) q0 [9 z. \
- Returns:
0 }; M8 l& L) A+ }; }$ y - dataMat - 数据列表
Y3 o& {+ A7 i4 w1 l. d - labelMat - 标签列表& T3 [\" [4 K* I
- """
/ k o8 U0 U6 T' N8 k - def loadDataSet():
\" `: I! S; B$ W& k& B - dataMat = [] #创建数据列表3 S* i* A$ @+ ]( W/ g\" I
- labelMat = [] #创建标签列表 }) X) }/ a& S) b
- fr = open('testSet.txt') #打开文件
8 U4 a0 O6 I o7 j0 j4 }: V5 Z0 v; F% t - for line in fr.readlines(): #逐行读取
6 r& X( P8 H+ K3 B4 F% k/ C - lineArr = line.strip().split() #去回车,放入列表+ z' Z+ ?/ t; w9 @7 J4 c
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据1 w+ R* p- j7 v& G9 c9 o
- labelMat.append(int(lineArr[2])) #添加标签
1 D! G2 Y; X7 u( s2 G3 S* Z& E - fr.close() #关闭文件$ V( R/ ]0 F/ Z) Q ~& z( J; y$ ~+ X
- return dataMat, labelMat #返回4 A1 j8 _; ?; D\" W8 k/ |
. F; r, b9 V) |2 h; E: E9 P\" e- """! \- ]- B& _) \% z) c% [
- 函数说明:sigmoid函数7 k! P( O' v: c: R
7 L5 c' ~) G. P/ Z# b+ Z; f; |2 x- Parameters:
! q3 a# [# ^, z6 } - inX - 数据4 X- C$ Y7 |6 W9 g1 ~/ t
- Returns:
1 _7 N4 q& L2 ~4 w% Q/ F - sigmoid函数8 k, ^9 Z3 E; s* C
- """
% v0 f: H4 Q( |9 A! g- S L3 h4 { - def sigmoid(inX):
! D# S: `2 `% A! B8 ?) M6 C _ - return 1.0 / (1 + np.exp(-inX))3 ]' v( B7 A5 U, E- r+ L* @
\" s% F, T4 A) E4 f4 `& j9 Z& j9 n- # B/ o! @0 h4 a A
- """! T, f1 {9 f+ J) R7 D* i ^$ A: O
- 函数说明:梯度上升算法
0 v$ Y5 |# m) y1 n- _8 _ - 6 q, m* L6 [\" Q9 V\" U4 h! \
- Parameters:
* }$ y# k0 u+ M - dataMatIn - 数据集
$ y$ |: m) S) H, s8 H' T - classLabels - 数据标签
; @# R# H\" t7 k! L& L _ - Returns:0 z6 W0 o5 r1 J- l, j: C) R1 }
- weights.getA() - 求得的权重数组(最优参数)+ O* |3 I8 p* o% c9 M. l
- """3 {2 Z7 ?1 Q' i4 b
- def gradAscent(dataMatIn, classLabels):8 M8 A! l$ F\" Y\" I; ^1 ], D
- dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
\" T. C) h) E0 ?- \* ?+ A - labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置
% U# T: J$ p\" d7 l - m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
7 |* a7 S, L- E8 @4 I- f8 f - alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。
/ I5 r+ }& }' K% P: s - maxCycles = 500 #最大迭代次数
' Y4 Z1 F& V3 T6 b - weights = np.ones((n,1))6 R# E( C0 d5 ?& z. K W/ V4 h# S
- for k in range(maxCycles):* K, [# e6 R5 c; F' X, d- L
- h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式
$ D/ d3 R( Y |2 \ - error = labelMat - h
6 {\" |: I, b) |! S, N! K, i G+ V\" P - weights = weights + alpha * dataMatrix.transpose() * error
* s7 b9 u. T+ y; N f1 D/ R - return weights.getA() #将矩阵转换为数组,返回权重数组
# J8 x- Q2 l& v0 \6 L
- X5 D' `& V9 J& n2 z$ D( `% Z, ^- if __name__ == '__main__':# ]0 ?. r' r$ I& H. P
- dataMat, labelMat = loadDataSet() & b4 Y+ I2 D. ?7 ~
- print(gradAscent(dataMat, labelMat))
% B( {+ ?! k5 Y+ L9 m
复制代码 运行结果- [[ 4.12414349]$ _* n! x7 m- w/ B# L
- [ 0.48007329], a\" g, Z& P: x& G5 ~8 P0 D' G
- [-0.6168482 ]]
4 |1 p% e& z: e' k\" R
复制代码
% C% x. l8 N, R) e8 j- b |
zan
|