- 在线时间
- 479 小时
- 最后登录
- 2026-4-13
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7789 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
- """
) u0 I2 I) \& e2 h$ ] - 函数说明:梯度上升算法测试函数
% A# |6 @& P4 w - ) o C, K5 x% u/ [* ]. e
- 求函数f(x) = -x^2 + 4x的极大值4 z/ v$ y8 j; o( L5 S+ `( [
- $ q0 d& m1 w( |( l
- Parameters:
) X. F0 H' Z: t - 无0 \2 f7 T/ M0 W( k
- Returns:
) F& c; A0 D$ M9 v\" I- r6 j - 无
2 {% r4 M% o. m* Y) o. }3 x+ [' ] - """( A/ f _) E9 r) k. @( q: S3 n
- def Gradient_Ascent_test():. H. p\" e+ v; H% _6 V\" E, [; {8 F
- def f_prime(x_old): #f(x)的导数\" A/ Y6 g2 p4 z2 N$ X% w7 ?
- return -2 * x_old + 4
, M4 ?* v% Q7 t - x_old = -1 #初始值,给一个小于x_new的值
$ s; m: B' ^' U3 U i y, t - x_new = 0 #梯度上升算法初始值,即从(0,0)开始- B7 }0 {$ ^7 M\" ?' o1 n. t
- alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
/ s3 Z! @% v5 ~7 j; `/ | - presision = 0.00000001 #精度,也就是更新阈值
1 O6 H, L% y3 K* ^& ^ - while abs(x_new - x_old) > presision:
3 a) R$ I9 Z# u6 b+ @ - x_old = x_new; M3 x0 k\" \7 }2 g
- x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
/ R- q$ V: y3 D3 J - print(x_new) #打印最终求解的极值近似值, M, O6 k$ _, C8 @$ I8 `3 i4 B8 t
- ) `% A\" i, ]8 _
- if __name__ == '__main__':3 E- x! e' \% T( F) A* e9 u! N) M' p/ |
- Gradient_Ascent_test()/ o, }: G- |; S4 q- J0 p
复制代码 运行实例:- 1.9999995152798573 e% o7 D4 V+ G\" v; l9 A
复制代码 案例数据集下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Logistic/testSet.txt- -0.017612 14.053064 06 v: m4 t\" c. g/ L5 r s
- -1.395634 4.662541 1) W, I$ O1 U9 X% y; D3 K- v/ X
- -0.752157 6.538620 00 |. C. }8 O( H& N: y
- -1.322371 7.152853 0% @5 ?) l/ Y3 s1 h: `- q) P
- 0.423363 11.054677 06 y, P% U D: p. l# n* V, |! d, d
- 0.406704 7.067335 1! l* h0 C9 V) j) S1 b$ ]
- 0.667394 12.741452 0! j$ K4 W* g\" j' P
- -2.460150 6.866805 1
, L. w. G( `6 x+ I3 N - 0.569411 9.548755 0% o# X$ N$ R6 l8 ?+ m6 ]8 V
- -0.026632 10.427743 00 b& n' d1 j! ~% N. G
复制代码 这个数据有两维特征,因此可以将数据在一个二维平面上展示出来。我们可以将第一列数据(X1)看作x轴上的值,第二列数据(X2)看作y轴上的值。而最后一列数据即为分类标签。根据标签的不同,对这些点进行分类。- import matplotlib.pyplot as plt( q. @$ L9 O( t3 |% d, h& T
- import numpy as np
# _( B3 r2 k# M$ l! |
5 [% Y s$ Y z4 g9 N- """
$ s# U. p) `3 {% ~- ^+ c - 函数说明:加载数据
. I, z6 `) w4 d - , B6 g4 J* J( Z1 H$ G4 V4 O
- Parameters:: U8 G+ h z7 B+ T4 b
- 无4 Q, {) A3 {\" G7 _
- Returns:
+ v7 g( c6 A% s: c( W - dataMat - 数据列表
0 l' n# s. I# L\" {& }% ~ - labelMat - 标签列表
9 p# ]6 x7 b! |2 B0 S - """2 x5 v) h6 {- G7 g+ u\" l3 p8 i
- def loadDataSet():
& t0 \3 L0 a0 y7 N) y - dataMat = [] #创建数据列表
2 {3 U. v8 d* o) I4 | - labelMat = [] #创建标签列表
, T |3 E9 Q4 t' Z0 M - fr = open('testSet.txt') #打开文件
0 q9 M1 T3 O2 ~1 ]( X s - for line in fr.readlines(): #逐行读取
3 ~$ x6 ~7 E+ `- }7 u& y; d - lineArr = line.strip().split() #去回车,放入列表- x6 X\" D+ f- q\" f1 W' u
- dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
. Z- z: K Q0 H( l' M$ h - labelMat.append(int(lineArr[2])) #添加标签
$ J$ Z7 U' G f6 [4 o( [( w! `( v - fr.close() #关闭文件) v8 L; n/ c4 I# \
- return dataMat, labelMat #返回4 u1 l) C5 F7 J, ~: }/ {
- 9 a' @7 N4 Z, [2 Y: A! n
- """7 s1 t! h, e0 U) M* k8 ~
- 函数说明:绘制数据集
+ Y* z, I\" F8 ?/ ~! A! M& [* Z - / \9 C; a7 o) Z% P5 X; s
- Parameters:
6 v' @+ | z { - 无) M- R j- ]\" c' k; ~% P+ {
- Returns:0 d# u0 `+ G1 T( \
- 无
% {4 J9 K1 e4 J3 Y' s - """
4 ?( N* h# l, \* M& x* M) ? - def plotDataSet():\" Z! R5 j# R1 p
- dataMat, labelMat = loadDataSet() #加载数据集
8 u% h; \8 ?; u# n* F - dataArr = np.array(dataMat) #转换成numpy的array数组
! p4 d; t' k; h - n = np.shape(dataMat)[0] #数据个数# z- J' G$ U& m0 M! ^$ h( v$ ^
- xcord1 = []; ycord1 = [] #正样本
) Q% _/ A; L. r5 _) _$ J4 J - xcord2 = []; ycord2 = [] #负样本
$ |) d/ Z: C3 R4 v2 b - for i in range(n): #根据数据集标签进行分类
4 G& g L T4 a) I' J9 L - if int(labelMat[i]) == 1: j6 k2 f! L! w9 ?9 x8 H) h. }$ Z
- xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1为正样本
6 D: \1 A' e0 n3 Y- |! G: a3 k, a - else:
. M/ I' q, k3 Y - xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) #0为负样本
9 ~0 S( X- U% d/ U4 | - fig = plt.figure()8 x X& I3 n5 x
- ax = fig.add_subplot(111) #添加subplot
+ D* b\" D% s4 e. w9 W* } - ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#绘制正样本
5 S! W1 D2 m R/ Y7 m* r/ m - ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #绘制负样本
. E\" N. I' R4 y$ Y - plt.title('DataSet') #绘制title0 {- r* p2 \0 b
- plt.xlabel('x'); plt.ylabel('y') #绘制label
8 a+ V2 z) Q! Y L& t - plt.show() #显示$ f% H/ k4 C9 k+ Q\" I [
\" U* f( e8 Y0 F7 p$ A- if __name__ == '__main__':
/ q0 i( `/ I3 p. D5 o. D - plotDataSet()
6 Z3 \\" p4 s! u
复制代码
9 q: X- J4 I' G; B2 V从上图可以看出数据的分布情况。假设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$ }! `/ ^* Q- @8 @& Z0 c% x5 o
& ~# {0 K- l5 D' o5 i# h2 N- """+ l1 d8 h0 \* h+ V0 w
- 函数说明:加载数据- J0 }- z. l4 y
- 7 k0 a& U5 o0 N, ^
- Parameters:
- c! i& m\" C4 I/ J! s# y1 M - 无* O* B# R/ U2 Z6 u# \/ q
- Returns: o* G7 ?; v# u8 C% S* p
- dataMat - 数据列表- P; u1 z% P* b1 T/ G
- labelMat - 标签列表
. f; W( P% w\" D7 H; A7 B2 d - """, h. E\" }1 J: M( o. P\" G
- def loadDataSet():\" W! ~( Y. e- E5 a9 }\" w2 p2 w0 c# c
- dataMat = [] #创建数据列表; |) N7 Z! O9 G. y
- labelMat = [] #创建标签列表
7 g1 A! u/ N* U' U. J3 \6 ? - fr = open('testSet.txt') #打开文件
n& U$ x6 z- W2 c' u, s5 q/ Z - for line in fr.readlines(): #逐行读取: g+ F& z5 ~: i
- lineArr = line.strip().split() #去回车,放入列表
. |\" U' _% J r - dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加数据
/ n8 d+ v5 {9 R- `9 @% }. ?& k - labelMat.append(int(lineArr[2])) #添加标签! s8 {, l9 e6 u
- fr.close() #关闭文件
1 z3 a' m L+ {\" T2 j2 h/ c - return dataMat, labelMat #返回. c v% b# l1 r7 W
( r/ P* b4 E( M# g- """' @( F\" @, O& j0 Q9 H& }
- 函数说明:sigmoid函数: j, t1 E A- T. g
- ' s' l5 ?5 R% l. [( l& F2 _' E$ G
- Parameters:
6 R# v) s2 N1 `, R- H - inX - 数据& Z$ j4 }( `& G
- Returns:! g+ c8 B7 ^3 i3 a- ]( M3 b6 I
- sigmoid函数
. `5 ]) f$ W3 G- V7 l3 ~. l8 K - """
* @9 w/ a! e; S - def sigmoid(inX):
, ?! h0 r' i$ z$ N# O) n2 r - return 1.0 / (1 + np.exp(-inX)), T/ {! L; D( G1 ~# j, N% U
- 1 A+ I* l: d/ k. }) L' `9 f
- + B, p5 a\" V0 a% v! |
- """( o& @4 x3 B\" @
- 函数说明:梯度上升算法; R2 ~, C& Y$ Y2 J3 x) \
- + }, F2 y9 |4 s- A: D
- Parameters:3 ^( \2 G; q- k# g% |: X8 S
- dataMatIn - 数据集 y! O\" J/ n' x* ~, @
- classLabels - 数据标签
/ E0 {: l4 v$ v) C% q S - Returns:2 P: H9 X8 [' X) S0 U5 C- ?
- weights.getA() - 求得的权重数组(最优参数)
4 P! n7 v% m\" P' ] - """
# [% L) G! N: d; x. T7 ?7 j, F - def gradAscent(dataMatIn, classLabels):
! H% T' @$ r1 x' z - dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
2 k7 C. X5 ^6 i9 Y+ @! R - labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置( f; U2 P6 s1 M
- m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。9 E/ B, B* F. z8 |- t$ `
- alpha = 0.001 #移动步长,也就是学习速率,控制更新的幅度。, J( ~3 ?/ p! J
- maxCycles = 500 #最大迭代次数2 H3 ^2 ~9 y: x8 x- T( f9 z0 O& i
- weights = np.ones((n,1))
0 }0 h3 o3 B7 R! e - for k in range(maxCycles):0 v0 Y4 K/ y5 ]: R
- h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式3 b! I\" m1 R- ?9 m8 \0 y6 v. a9 ~
- error = labelMat - h
, d' u4 u! m$ U, S( \ - weights = weights + alpha * dataMatrix.transpose() * error
0 Z& {1 k4 ~: N: E' J - return weights.getA() #将矩阵转换为数组,返回权重数组+ W, l! A% v' d4 X3 u
- 1 H. l# y' S4 r$ Y+ h8 X: i\" _
- if __name__ == '__main__':5 j0 J4 A w n8 N
- dataMat, labelMat = loadDataSet()
\" C3 t7 T% j; q4 | - print(gradAscent(dataMat, labelMat)) r; ^7 y* k: E2 D9 g1 m1 ~$ s$ p
复制代码 运行结果- [[ 4.12414349]
7 G8 k) E# q& L7 T2 r8 ? - [ 0.48007329]
% d3 h/ n H+ x7 \9 r# W8 _ - [-0.6168482 ]]! e! f+ @( a5 Q8 B' {' x7 t9 K
复制代码 / B y8 X8 ~" R) o4 I( o
|
zan
|