线形回归和梯度下降的Python实例。

内容模仿学习于:https://www.cnblogs.com/focusonepoint/p/6394339.html

本文只是做为一个自我梳理

线形回归的特点

  1. 将特征x 和结果 y 分别放入两个不同矩阵
  2. 多元线形回归的时候添加一个X0=1多元线形回归的时候添加一个X0=1
  3. 梯度下降 梯度下降
  4. 预测 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=1m(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

ok 大功告成

03-09 05:48