python线性回归练习

数据集链接

1 实现简单示例函数

在该部分练习中,将通过代码实现返回一个5*5的对角矩阵。输出与如下相同:

1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
python:

###在这里填入代码###
matrix = [[1, 0, 0, 0, 0], 
          [0, 1, 0, 0, 0],
          [0, 0, 1, 0, 0], 
          [0, 0, 0, 1, 0],
          [0, 0, 0, 0, 1]]

for row in matrix:
    for num in row:
        print(num, end=' ')
    print()

2.假设你是一家餐厅的领导,正在考虑在不同的城市开设新的分店。该连锁店已经在不同的城市有了餐车,并且你能够获得每个城市的人口和利润数据。

现在需要使用这些数据来帮助你选择下一个被扩展的城市。

文件ex1data1.txt包含线性回归问题的数据集。第一列数据对应城市人口,第二列数据对应那座城市的餐车的利润。利润为负时表示亏损。

对于ex1data1.txt,可以使用散点图进行可视化,因为它只有两个属性(人口、利润)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os

%matplotlib inline
# 数据存储路径
path = '/home/jovyan/work/ex1data1.txt'

# 读入相应的数据文件
data = pd.read_csv(path, header=None,names=['Population','Profit'])

#查看数据的前五条
data.head(5)

实现数据可视化的代码,该部分数据绘制出的图像应与如下相同。

要点:

实现散点图可视化
数据分布为红色点
标清横纵坐标名称

###在这里填入代码###
import matplotlib.pyplot as plt

# 读取数据集
data = np.loadtxt( '/home/jovyan/work/ex1data1.txt', delimiter=',')

# 分割数据到X和y
X = data[:, 0]  # population
y = data[:, 1]  # profit

# 绘制散点图
plt.scatter(X, y, c='r', marker='.')  
plt.xlabel('Population')  
plt.ylabel('Profit')  
plt.title('Population vs Profit')

# 显示散点图
plt.show() 

效果
在这里插入图片描述

3.梯度下降

在上一部分的练习中,我们已经将所需要用到的数据加载至变量data中,并为其列分别进行命名。

接下来,我们在数据中添加了一个维度来拟合截距项 𝜃0 。并将初始参数值设为0,学习率 𝛼设为0.01。

#在列索引为0处添加数据列,该列值均为1
path = '/home/jovyan/work/ex1data1.txt'

# 读入相应的数据文件
data = pd.read_csv(path, header=None,names=['Population','Profit'])


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

#获取数据列数
cols = data.shape[1]

#对变量X和y进行初始化,并将其数据类型转换为矩阵
X = data.iloc[:,0:cols-1]
y = data.iloc[:,cols-1:cols]
X = np.matrix(X.values)
y = np.matrix(y.values)

#学习率、迭代次数的初始化
alpha = 0.01
iterations = 1500

在该部分练习任务中,你需要实现一个计算成本 𝐽(𝜃)
的函数computeCost,用于检查梯度下降实现的收敛性。

其中,X和y不是标量值,而是矩阵,其行代表训练集中的示例。

要点: 完成该函数后,将 𝜃
值初始化为0并进行成本的计算,将得到的成本值打印出来。

如果结果为32.07,则计算通过。


def computeCost(X, y, theta):
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))

theta = np.matrix(np.array([0,0]))
computeCost(X, y, theta)

接下来,我们将实现梯度下降,给出的代码已经实现了循环结构,你只需要在每次的迭代中提供 𝜃
的更新。

在进行代码实现时,请确保你了解要优化的内容,和正在更新的内容:

def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.ravel().shape[1])
    cost = np.zeros(iters)
    
    for i in range(iters):
        error = (X * theta.T) - y
        
        for j in range(parameters):
            term = np.multiply(error, X[:,j])
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))
            
        theta = temp
        cost[i] = computeCost(X, y, theta)
        
    return theta, cost

g, cost = gradientDescent(X, y, theta, alpha, iterations)
computeCost(X, y, g)
x = np.linspace(data.Population.min(), data.Population.max(), 100)
f = g[0, 0] + (g[0, 1] * x)

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

效果:
在这里插入图片描述
为了更好地理解成本函数的迭代计算,将每一步计算的cost值进行记录并绘制:

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

效果
在这里插入图片描述

4.在该部分中,将使用多个变量来实现用线性回归预测房屋价格。假设你目前正在出售房屋,想知道什么是好的市场价格。

一种方法是首先收集最近出售房屋的信息,其次是建立房屋价格模型。

文件ex1data2.txt包含俄勒冈州波特兰市的房屋价格及相关信息。第一列是房屋的大小(以平方英尺为单位),第二列是卧室的个数,第三列是房屋的价格。
在该部分练习中,你的任务是编写代码并实现数据集中的数据标准化。
要点:
从数据集中减去每个特征的平均值。减去平均值后,再将新的特征值除以各自的“标准差”

path = '/home/jovyan/work/ex1data2.txt'
data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
data2 = (data2 - data2.mean()) / data2.std()
###在这里填入代码###

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, iterations)

# get the cost (error) of the model
computeCost(X2, y2, g2)
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iterations), cost2, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值