#coding=gbk
import numpy as np
from numpy.linalg import inv
from numpy importdot
from numpy importmat
import pandas as pd
#获取X和Y向量
dataset = pd.read_csv('data.csv')
#print(dataset)
temp = dataset.iloc[:,0:3]#取数据集中
temp['x0'] = 1#截距
X = temp.iloc[:,[3,0,1,2]]
Y = dataset.iloc[:,3].values.reshape(200,1)
#Y =dataset.iloc[:,3].values.reshape(200,1)
#print(Y)
#最小二乘法
theta = dot(dot(inv(dot(X.T,X)),X.T),Y)
print("最小二乘法计算theta:\n",theta.reshape(4,1))
#梯度下降法
theta = np.array([1.,1.,1.,1.]).reshape(4,1)
alpha = 0.02#学习率
temp = theta #缓存,一块同步更新,很重要
X0 = X.iloc[:,0].values.reshape(len(Y),1)
X1 = X.iloc[:,1].values.reshape(len(Y),1)
X2 = X.iloc[:,2].values.reshape(len(Y),1)
X3 = X.iloc[:,3].values.reshape(len(Y),1)
for i in range(10000):
temp[0] = theta[0] + alpha*np.sum((Y-dot(X,theta))*X0)/200.
temp[1] = theta[1] + alpha*np.sum((Y-dot(X,theta))*X1)/200.
temp[2] = theta[2] + alpha*np.sum((Y-dot(X,theta))*X2)/200.
temp[3] = theta[3] + alpha*np.sum((Y-dot(X,theta))*X3)/200.
theta = temp
print ("梯度下降法计算theta:",theta)