Jupyter实现机器学习之单变量线性回归
pip3 install pandas逗号分隔值(Comma-Separated Values,CSV)文件ex1data1.txt包含线性回归问题的数据集。第一列是城市人口,第二列是在那个城市,一辆食品卡车的利润。利润的负值表示失利。(每一行表示一个城市,第一列为城市人口,第二列为该城市能获得的食品卡车利润;如果已知一个城市的人口,需要预测食品卡车的利润)...
一、问题描述
给定一组数据(如下图所示),格式为a, b。a表示该城市的人口,b表示卖食品的卡车在该城市的利润。通俗理解,a越大,b也越大,所以本问题是告知一城市的人口,请预测卖食品的卡车在该城市的利润。属于单边变量线性回归问题(文件ex1data1.txt包含线性回归问题的数据集)。
二、Jupyter解决此问题的过程
1.导入数据分析所需要的库1
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
2.导入数据并查看
path = 'D:\Code\DataSets\ML_data_sets\ex1data1.txt'
data = pd.read_csv(path, header = None, names = ['Population', 'Profit'])
data.head()
注解:
①逗号分隔值文件(Comma-Separated Values,CSV)
②names添加列名,header用指定的行来作为标题,若原无标题且指定标题则设为None
③可视化效果如下图所示
3.绘制数据的散点图
data.plot(kind = 'scatter', x = 'Population', y = 'Profit', figsize = (8, 6)) #figsize设置figure的size
plt.show()

4.根据公式描述,建立X, y, theta矩阵
公式:
不知道列向量的Markdown格式
(1)新增一列,值为1
data.insert(0, 'Ones', 1)

(2)建立X, y, theta矩阵
cols = data.shape[1] #列数
X = data.iloc[:,0:cols-1] #前2列的数据
y = data.iloc[:,cols-1:] #最后一列的数据
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix([0,0])
5.代价函数
# 代价函数 len(X)行数
def computeCost(X, y, theta):
inner = np.power((X * theta.T) - y, 2)
return np.sum(inner) / (2 * len(X))
6.梯度下降算法
#批量梯度下降算法
def gradientDescent(X, y, theta, alpha, epoch):
temp = np.matrix(np.zeros(theta.shape))
cost = np.zeros(epoch)
m = X.shape[0]
for i in range(epoch):
temp = theta - (alpha / m) * (X * theta.T - y).T * X
theta = temp
cost[i] = computeCost(X, y, theta)
return theta, cost
7.验证结果
(1)计算
alpha = 0.01
epoch = 1000
final_theta, cost = gradientDescent(X, y, theta, alpha, epoch)
(2)线性回归可视化
x = np.linspace(data.Population.min(), data.Population.max(), 100) # 横坐标
f = final_theta[0, 0] + (final_theta[0, 1] * x) # 纵坐标,利润
fig, ax = plt.subplots(figsize=(6,4))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data['Population'], data.Profit, label='Traning Data')
ax.legend(loc=2) # 2表示在左上角
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

(3)代价可视化
fig, ax = plt.subplots(figsize=(8,4))
ax.plot(np.arange(epoch), cost, 'r') # np.arange()返回等差数组
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

三、参考文献
1.吴恩达机器学习作业Python实现(一):线性回归
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)