通过学习斯坦福公开课的线性规划和梯度下降,参考他人代码自己做了测试,写了个类以后有时间再去扩展,代码注释以后再加,作业好多:
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