Skip to main content

线性回归

线性回归是建立因变量与一个或多个自变量之间线性关系的模型。它试图通过找到一条直线(或超平面)来最小化预测值与实际值之间的误差。

应用场景

  • 房价预测
  • 销售趋势分析
  • 气温预测
  • 金融市场预测

优缺点

优点缺点
简单直观,易于理解和实现假设变量间线性关系
计算效率高对异常值敏感
不需要调整太多参数无法捕捉非线性关系

原理

线性回归是利用连续的变量来估计实际数值(例如房价、呼叫次数和总销售额等)。线性回归算法就是找到一个自变量x与因变量y的最佳线性关系,尽可能贴近所有的点,一条最佳的直线,这条直线就是回归线。

回归关系方程为:Y = wX + b

回归损失函数:均方误差

线性回归原理代码

"""
# 公式y = wx + b
# w为权重,b为偏置值

import numpy as np
from matplotlib import pyplot as plt
class Line:
def __init__(self):

# 设置初始的w与b
self.w = 1
self.b = 0

# 设置每次移动步幅
self.learn_rate = 0.01

# 创建一个两行一列的窗口和两个画布
self.fig, (self.ax1, self.ax2) = plt.subplots(2, 1)

# 创建一个获取损失值的数组
self.loss_list = []

# 获取传入的数据,散点
def get_data(self, data):
# 获取数据的初始x与y
self.X = np.array(data)[:,0]
self.y = np.array(data)[:,1]

# 将函数组合
def predict(self, x):
return self.w * x + self.b

# 进行模型训练,提供训练次数
def train(self, epoch_times):
for epoch in range(epoch_times):

# 统计损失次数
totle_loss = 0

# 遍历数据中所有对应的x与y
for x, y in zip(self.X, self.y):

# 计算在函数上的y值
y_pred = self.predict(x)

# 自求导,求出当前w与b
# 梯度w与b就是离最佳线的距离
gradient_w = -2 * x * (y - y_pred)
gradient_b = -2 * (y - y_pred)

# 更新新的w与b,不断靠近最佳线
self.w -= self.learn_rate * gradient_w
self.b -= self.learn_rate * gradient_b

# 计算均值方差,使用原y值减去在函数上的y值,计算损失值e
loss = (y - y_pred) ** 2
totle_loss += loss
epoch_loss = totle_loss / len(self.X)
self.loss_list.append(epoch_loss)
# 训练10次后打印训练十次后的缺失值
if epoch % 10 == 0:
print(f"loss: {epoch_loss}")
self.plot()
plt.ioff()
plt.show()

def plot(self):
plt.ion()
self.ax1.clear()
self.ax2.clear()
x = np.linspace(0, 10, 100)
self.ax1.scatter(self.X, self.y, c = "g")
self.ax1.plot(x, self.predict(x), c = "b")
self.ax2.plot(list(range(len(self.loss_list))), self.loss_list)
plt.show()
plt.pause(0.1)

if __name__ == '__main__':
data = [(1, 1), (1.8, 2), (2.5, 3), (4.2, 4), (5, 5), (6, 6), (7, 7)]
s = Line()
s.get_data(data)
s.train(100)

使用sklearn模块

import numpy as np
from sklearn import datasets
from sklearn.linear_model import LinearRegression

# 加载加利福尼亚房子数据集
loaded_data = datasets.fetch_california_housing()

# 数据集特征数据
data_X = loaded_data.data
# 数据集的标签数据
data_y = loaded_data.target

# 创建线性回归模型
model = LinearRegression()

# 拟合模型,将标签和数据训练出一个线性回归公式
model.fit(data_X, data_y)

# 打印回归系数和截距
print("回归系数 (斜率):", model.coef_)
print("截距:", model.intercept_)

# 预测四所房屋价格,将对应标签的数据放入公式中
# 计算出所给的四组数据对应的价格
print(model.predict(data_X[:4, :]))

# 真实价格
print(data_y[:4])

# 获取模型参数
# 你可以传给模型构造函数的参数(也就是初始化用的参数)
print(model.get_params())
# //{'copy_X': True, 'fit_intercept': True, 'n_jobs': None, 'positive': False}

判定系数

print(model.score(data_X, data_y))
# // 0.606232685199805
# 表示这个模型可以解释60%的y的变化,可以判断该模型训练效果