通过学习斯坦福公开课的线性规划和梯度下降,参考他人代码自己做了测试,写了个类以后有时间再去扩展,代码注释以后再加,作业好多:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
import numpy as np import matplotlib.pyplot as plt import random class dataMinning: datasets = [] labelsets = [] addressD = '' #Data folder addressL = '' #Label folder npDatasets = np.zeros( 1 ) npLabelsets = np.zeros( 1 ) cost = [] numIterations = 0 alpha = 0 theta = np.ones( 2 ) #pCols = 0 #dRows = 0 def __init__( self ,addressD,addressL,theta,numIterations,alpha,datasets = None ): if datasets is None : self .datasets = [] else : self .datasets = datasets self .addressD = addressD self .addressL = addressL self .theta = theta self .numIterations = numIterations self .alpha = alpha def readFrom( self ): fd = open ( self .addressD, 'r' ) for line in fd: tmp = line[: - 1 ].split() self .datasets.append([ int (i) for i in tmp]) fd.close() self .npDatasets = np.array( self .datasets) fl = open ( self .addressL, 'r' ) for line in fl: tmp = line[: - 1 ].split() self .labelsets.append([ int (i) for i in tmp]) fl.close() tm = [] for item in self .labelsets: tm = tm + item self .npLabelsets = np.array(tm) def genData( self ,numPoints,bias,variance): self .genx = np.zeros(shape = (numPoints, 2 )) self .geny = np.zeros(shape = numPoints) for i in range ( 0 ,numPoints): self .genx[i][ 0 ] = 1 self .genx[i][ 1 ] = i self .geny[i] = (i + bias) + random.uniform( 0 , 1 ) * variance def gradientDescent( self ): xTrans = self .genx.transpose() # i = 0 while i < self .numIterations: hypothesis = np.dot( self .genx, self .theta) loss = hypothesis - self .geny #record the cost self .cost.append(np. sum (loss * * 2 )) #calculate the gradient gradient = np.dot(xTrans,loss) #updata, gradientDescent self .theta = self .theta - self .alpha * gradient i = i + 1 def show( self ): print 'yes' if __name__ = = "__main__" : c = dataMinning( 'c:\\city.txt' , 'c:\\st.txt' ,np.ones( 2 ), 100000 , 0.000005 ) c.genData( 100 , 25 , 10 ) c.gradientDescent() cx = range ( len (c.cost)) plt.figure( 1 ) plt.plot(cx,c.cost) plt.ylim( 0 , 25000 ) plt.figure( 2 ) plt.plot(c.genx[:, 1 ],c.geny, 'b.' ) x = np.arange( 0 , 100 , 0.1 ) y = x * c.theta[ 1 ] + c.theta[ 0 ] plt.plot(x,y) plt.margins( 0.2 ) plt.show() |
图1. 迭代过程中的误差cost
图2. 数据散点图和解直线
总结
以上就是本文关于Python编程实现线性回归和批量梯度下降法代码实例的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:https://www.cnblogs.com/Key-Ky/archive/2013/12/10/3468290.html