摘选于 机器学习- 一元线性回归
通过分析披萨的直径与价格的线性关系,来预测任一直径的披萨的价格
- 理论
披萨直径 x 和价格的关系可以表示为
计算斜率 w
2.代码实现
首先导入相关库
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
定义一个方法绘制图形
def runplt():
plt.figure()
plt.title("Pizza price plotted against diameter")
plt.xlabel('Diameter')
plt.ylabel('Price')
plt.grid(True) # 图表中加入网格线
plt.xlim(0, 25) # x的取值范围
plt.ylim(0, 25) # y的取值范围
return plt
数据处理
pizza = pd.DataFrame({'Diameter': [6, 8, 10, 14, 18], 'Price': [7.0, 9.0, 13.0, 17.5, 18.0]})
dia = pizza.loc[:, 'Diameter'].values
price = pizza.loc[:, 'Price'].values
根据所有半径的方差和半径,价格的协方差求出直线斜率 w,画出预测图线(运行结果中图形表里的实线)
variance = np.var(dia, ddof=1) # 求出直径的方差
covariance = np.cov(dia, price)[0][1]
w = covariance / variance # 求出直线斜率
b = np.mean(price) - w * np.mean(dia) # 求出直线截距
print("w = %f\n b = %f" % (w, b))
plt = runplt()
y_price = w * dia + b # 预测直线
plt.plot(dia, price, 'k.')
plt.plot(dia, y_price, 'k-')
使用模型库中函数,直接预测结果(图形表中的虚线)。将两种结果进行比较
model = LinearRegression() # 创建模型
X = dia.reshape((-1, 1)) # 将dia转换为1列
y = price
model.fit(X, y) # 拟合
X2 = [[0], [25]] # 取两个预测值
y2 = model.predict(X2) # 进行预测
print(y2) # 查看预测值
plt.plot(dia, price, 'k.')
plt.plot(X2, y2, 'b--') # 画出拟合曲线
# 画出残差
yr = model.predict(X)
for index, x in enumerate(X):
plt.plot([x, x], [y[index], yr[index]], 'r-')
plt.show()
- 运行结果