吴恩达机器学习作业(2):多元线性回归

目录

1)数据处理

2)代价函数

3)Scikit-learn训练数据集

4)正规方程

练习1还包括一个房屋价格数据集,其中有2个变量(房子的大小,卧室的数量)和目标(房子的价格)。 我们使用我们已经应用的技术来分析数据集。

1)数据处理

还是那个建议,大家拿到数据先看看数据长什么样子。

path =  'ex1data2.txt'
data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
data2.head()

对于此任务,我们添加了另一个预处理步骤 - 特征归一化。 这个对于pandas来说很简单

data2 = (data2 - data2.mean()) / data2.std()
data2.head()

2)代价函数

现在我们重复第1部分的预处理步骤,并对新数据集运行线性回归程序。

data2.insert(0, 'Ones', 1)

# set X (training data) and y (target variable)
cols = data2.shape[1]
X2 = data2.iloc[:,0:cols-1]
y2 = data2.iloc[:,cols-1:cols]

# convert to matrices and initialize theta
X2 = np.matrix(X2.values)
y2 = np.matrix(y2.values)
theta2 = np.matrix(np.array([0,0,0]))

# perform linear regression on the data set
g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)

# get the cost (error) of the model
computeCost(X2, y2, g2)
0.13070336960771892

我们也可以快速查看这一个的训练进程。

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost2, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

吴恩达机器学习作业(2):多元线性回归_第1张图片

3)Scikit-learn训练数据集

我们也可以使用scikit-learn的线性回归函数,而不是从头开始实现这些算法。 我们将scikit-learn的线性回归算法应用于第1部分的数据,并看看它的表现。

from sklearn import linear_model
model = linear_model.LinearRegression()
model.fit(X, y)

scikit-learn model的预测表现

x = np.array(X[:, 1].A1)    #选取X的第1列(从0列开始)
f = model.predict(X).flatten()

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Traning Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

4)正规方程

正规方程是通过求解下面的方程来找出使得代价函数最小的参数的:

                                                                                \frac{\partial }{\partial {​{\theta }_{j}}}J\left( {​{\theta }_{j}} \right)=0

假设我们的训练集特征矩阵为 X(包含了?0=1)并且我们的训练集结果为向量 y,则利用正规方程解出向量:    

                                                                               \theta ={​{\left( {​{X}^{T}}X \right)}^{-1}}{​{X}^{T}}y

梯度下降与正规方程的比较:

梯度下降:需要选择学习率α,需要多次迭代,当特征数量n大时也能较好适用,适用于各种类型的模型;

正规方程:不需要选择学习率α,一次计算得出,需要计算{​{\left( {​{X}^{T}}X \right)}^{-1}},如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为O(n^3)通常来说当n小于10000 时还是可以接受的,只适用于线性模型,不适合逻辑回归模型等其他模型

# 正规方程
def normalEqn(X, y):
    theta = np.linalg.inv(X.T@X)@X.T@y#X.T@X等价于X.T.dot(X)
    return theta
final_theta2=normalEqn(X, y)#感觉和批量梯度下降的theta的值有点差距
final_theta2
matrix([[-3.89578088],
        [ 1.19303364]])

你可能感兴趣的:(机器学习,机器学习,线性回归,python)