线形回归和梯度下降的Python实例。
内容模仿学习于:https://www.cnblogs.com/focusonepoint/p/6394339.html
本文只是做为一个自我梳理
线形回归的特点
- 将特征x 和结果 y 分别放入两个不同矩阵
- 多元线形回归的时候添加一个X0=1多元线形回归的时候添加一个X0=1
- 梯度下降 梯度下降
- 预测 h(x)=θTX 预测 h(x)=θTX
所以第一步加载矩阵:
数据就搬照链接里面的
data = np.array([[1.1,1.5,2.5],
[1.3,1.9,3.2],
[1.5,2.3,3.9],
[1.7,2.7,4.6],
[1.9,3.1,5.3],
[2.1,3.5,6]])
这里面x的值就是前两个,一共有六组训练。例:Y=2.5=1.1θ1+1.5θ2+θ0
def getData(data):
m,n = np.shape(data)
trainData = np.ones((m,n))
trainData[:,:-1] = data[:,:-1] #这一步完成将y分离,并且前面添加了一个x0 = 1;
trainLabel = data[:,-1] #赋予其y值;
return trainData,trainLabel
X[:,]是numpy中数组的一种写法,表示对一个二维数组,取该二维数组第一维中的所有数据;第二维中取第0个数据,直观来说,X[:,0]就是取所有行的第1个数据,
X[:,1] 就是取所有行的第2个数据;
X[:,:2]代表区所有行的前两个数据;
这样就完成了第一步和第二步。
第三步梯度下降
θj:=θj−αm1i=1∑m(h(X(i))−y(i))∗x(j)
这是梯度下降的公式 ,此间需要用到的参数有,x,y, θ,学习率α ,训练集数量m,训练次数maxIteration
这里我们都需要为这些变量一个初始值
x,y 就是上面的trainData 和 trainLabel
θ值我们需要初始化,有多少个x值就初始化多少个θ,用矩阵的方式
m 就是m行(m个训练数量)
最大次数自己定
学习率自己取,不要取大
m, n = np.shape(trainData)
#print(trainData)
theta = np.ones(n)
#print(theta)
alpha = 0.05
maxIteration = 9999
def batchGradientDescent(x, y, theta, alpha, m, maxIterations):
xTrains = x.transpose() #将x转置
for i in range(0, maxIterations):
hypothesis = np.dot(x, theta) #计算h(x)的值
#print(hypothesis)
loss = hypothesis - y #计算h(X (i) )−y (i))
#print(loss)
gradient = np.dot(xTrains, loss) / m #用x的转置乘以loss 就是等式最后和x(j)相乘
theta = theta - alpha * gradient #得到θ
return theta
于是完成了第三步
最后一步,预测h(x)的值,其实就是h(x)=θ0X0+θ1X1+θ3X3+θ4X4........+θnXn
θ与X的矩阵相乘
def predict(x, theta):
yPre = np.dot(x, theta)
return yPre