【机器学习】线性回归

线性回归是什么?

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w’x+e,e为误差服从均值为0的正态分布。

适用场景?

趋势线:价格预测
流行病学:预测疫情发展

原理:

线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。

优缺点:

优点:
    (1)思想简单,实现容易。建模迅速,对于小数据量、简单的关系很有效;
    (2)是许多强大的非线性模型的基础。
    (3)线性回归模型十分容易理解,结果具有很好的可解释性,有利于决策分析。
    (4)蕴含机器学习中的很多重要思想。
    (5)能解决回归问题。
  缺点:
    (1)对于非线性数据或者数据特征间具有相关性多项式回归难以建模.
    (2)难以很好地表达高度复杂的数据。

最小二乘法

一般来说,线性回归都可以通过最小二乘法求出其方程,可以计算出对于y=ax+b的直线。

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5])
y = np.array([1, 2, 3, 3, 5])

plt.scatter(x, y)
plt.axis([0, 6, 0, 6])
plt.show()

x_mean = np.mean(x)
y_mean = np.mean(y)

# 分子
num = 0.0
# 分母
d = 0.0

for x_i, y_i in zip(x, y):
    num += (x_i - x_mean) * (y_i - y_mean)
    d += (x_i - x_mean) ** 2
a = num / d
b = y_mean - a * x_mean
print(a)

# 模型预测
predict_y = a * x + b
plt.scatter(x, y)
plt.plot(x, predict_y, color='r')
plt.show()

在这里插入图片描述
向量化运算,提高运算效率

# 向量化运算
vector_num = (x-x_mean).dot(y-y_mean)
vector_d =(x-x_mean).dot(x-x_mean)

a = vector_num/vector_d
print(a)

均方误差

# 均方误差
mse = np.sum((y - predict_y) ** 2) / len(y)
print(mse)
# 均方根误差
rmse = np.sqrt(np.sum((y - predict_y) ** 2) / len(y))
print(rmse)

sklearn中的数据集

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

boston = datasets.load_boston()
x = boston.data[:, 5]
y = boston.target

plt.scatter(x, y)
plt.show()

# 移除异常数据
x = x[y < 50]
y = y[y < 50]

plt.scatter(x, y)
plt.show()

x_mean = np.mean(x)
y_mean = np.mean(y)

# 向量化运算
vector_num = (x - x_mean).dot(y - y_mean)
vector_d = (x - x_mean).dot(x - x_mean)

a = vector_num / vector_d
print(a)

b = y_mean - a * x_mean

# 模型预测
predict_y = a * x + b
plt.scatter(x, y)
plt.plot(x, predict_y, color='r')
plt.show()

rmse = np.sqrt(np.sum((y - predict_y) ** 2) / len(y))
print('rmse',rmse)

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

boston = datasets.load_boston()
x = boston.data[:, 5]
y = boston.target

# 数据集分割
from sklearn.model_selection import train_test_split
train_data, test_data, train_label, test_lable = train_test_split(x, y, test_size=0.2, random_state=666)

# 模型训练 最小二乘法
x_mean = np.mean(train_data)
y_mean = np.mean(train_label)

# 向量化运算
vector_num = (x - x_mean).dot(y - y_mean)
vector_d = (x - x_mean).dot(x - x_mean)

a = vector_num / vector_d
print(a)

b = y_mean - a * x_mean

# 模型预测
predict_y = a * test_data + b

rmse = np.sqrt(np.sum((test_lable - predict_y) ** 2) / len(y))
print('rmse',rmse)

plt.scatter(test_data, test_lable)
plt.plot(test_data, predict_y, color='r')
plt.show()

在这里插入图片描述

# sklearn 回归评测指标
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error

mse = mean_squared_error(test_lable,predict_y)
mae = mean_absolute_error(test_lable,predict_y)

多元线性回归

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

boston = datasets.load_boston()
x = boston.data
y = boston.target

# 数据集分割
from sklearn.model_selection import train_test_split
train_data, test_data, train_label, test_lable = train_test_split(x, y, test_size=0.2, random_state=666)

xb = np.hstack([np.ones((len(train_data),1)),train_data])
theta = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(train_label)

# 截距
interceptor = theta[0]

# 斜率
ceef = theta[0:]

# 模型预测
xb_test = np.hstack([np.ones((len(test_data),1)),test_data])
predict_label = xb_test.dot(theta)

from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error

mse = mean_squared_error(test_lable,predict_label)
print(mse)

sklearn中的线性回归

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

boston = datasets.load_boston()
x = boston.data
y = boston.target

# 数据集分割
from sklearn.model_selection import train_test_split
train_data, test_data, train_label, test_lable = train_test_split(x, y, test_size=0.2, random_state=666)

from sklearn.linear_model import LinearRegression
lre = LinearRegression()

lre.fit(train_data,train_label)

p_l=lre.predict(test_data)
score=lre.score(test_data,test_lable)
print(score)

spark中的线性回归

那就得用Scala写程序了,导入包,训练模型,又是熟悉的流程。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值