IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 个人学习_21.8.12-线性回归部分 -> 正文阅读

[数据结构与算法]个人学习_21.8.12-线性回归部分

1.超简易代码(不用sklearn)

可以改进的地方:导入函数没写,不过大部分默认使用 .csv的格式

import numpy as np
import matplotlib.pyplot as plt

train_x = np.array([0.5, 0.6, 0.8, 1.1, 1.4])
train_y = np.array([5.0, 5.5, 6.0, 6.8, 7.0])
test_x = np.array([0.45, 0.55, 1.0, 1.3, 1.5])
test_y = np.array([4.8, 5.3, 6.4, 6.9, 7.3])
lr=0.01
times=1000

#这里这么写是为了画图
w0=[2]
w1=[2]
epoches=[0]
losses=[0]

#认为估算回归结果是 y_pred=w0*x+w1
#loss=(w0*x+w1-y)**2/2
for i in range(1,times+1):
    epoches.append(i)
    #d0--对w0求偏导,d1--对w1求偏导
    loss=((w0[-1]*train_x+w1[-1]-train_y)**2/2).sum()
    losses.append(loss)
    d0=(train_x*(w0[-1]*train_x+w1[-1]-train_y)).sum()
    d1=(w0[-1]*train_x+w1[-1]-train_y).sum()
    w0_new=w0[-1]-d0*lr
    w1_new=w1[-1]-d1*lr
    w0.append(w0_new)
    w1.append(w1_new)
    print('{:4}> w0={:.8f}, w1={:.8f}, loss={:.8f}'.format(epoches[-1], w0[-1], w1[-1], losses[-1]))

#作图
plt.subplot(313)
#加网线格子
plt.grid(linestyle=':')
plt.ylabel(r'$w0$',fontsize=14)
plt.plot(epoches,w0,c='blue',label=r'$w0$')
plt.legend()

plt.subplot(312)
plt.grid(linestyle=':')
plt.ylabel(r'$w1$',fontsize=14)
plt.plot(epoches,w1,c='dodgerblue',label=r'$w1$')
plt.legend()

plt.subplot(311)
plt.grid(linestyle=':')
plt.ylabel(r'$loss$',fontsize=14)
plt.plot(epoches,losses,c='orangered',label=r'$losses$')
plt.legend()

#作回归曲线
pred_test_y = w0[-1] + w1[-1] * test_x
plt.figure('Linear Regression', facecolor='lightgray')
plt.title('Linear Regression', fontsize=20)
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.scatter(train_x, train_y, marker='s', c='dodgerblue', alpha=0.5, s=80, label='Training')
plt.scatter(test_x, test_y, marker='D', c='orangered', alpha=0.5, s=60, label='Testing')
plt.scatter(test_x, pred_test_y, c='orangered', alpha=0.5, s=80, label='Predicted')
plt.plot(test_x, pred_test_y, '--', c='limegreen', label='Regression', linewidth=1)
plt.legend()
plt.show()
plt.show()

#带入测试库

loss=((w0[-1]*test_x+w1[-1]-test_y)**2/2).sum()
print('带入测试:y_pred={:.8f}*x+{:.8f}, loss={:.8f}'.format( w0[-1], w1[-1], loss))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.用相关API写

难点在于传的格式

方法:

import sklearn.linear_model as lm
# 创建模型
model = lm.LinearRegression()
# 训练模型
# 输入为一个二维数组表示的样本矩阵
# 输出为每个样本最终的结果
model.fit(输入, 输出) # 通过梯度下降法计算模型参数
# 预测输出  
# 输入array是一个二维数组,每一行是一个样本,每一列是一个特征。
result = model.predict(array)
#线性回归
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as plt

#训练
x, y = np.loadtxt('D:\BaiduNetdiskDownload\数据集 21.8\乔总结数据集\single.txt', delimiter=',', usecols=(0,1), unpack=True)
x = x.reshape(-1, 1)
model=lm.LinearRegression()
model.fit(x,y)
y_pred=model.predict(x)
#得到模型
#测试
test_x=(np.linspace(x.min(),x.max(),500)).reshape(-1,1)
y_test=model.predict(test_x)

#作图
plt.figure('Linear Regression',facecolor='lightgray')
plt.title('Linear Regression',fontsize=20)
plt.scatter(x,y,c='dodgerblue',alpha=0.75,s=60,label='sample')
plt.plot(test_x,y_test,c='orangered',label='regression')
plt.legend()
plt.show()

在这里插入图片描述

3.评估模块

import sklearn.metrics as sm

# 平均绝对值误差:1/m∑|实际输出-预测输出|
sm.mean_absolute_error(y, pred_y)
# 平均平方误差:SQRT(1/(实际输出-预测输出)^2)
sm.mean_squared_error(y, pred_y)
# 中位绝对值误差:MEDIAN(|实际输出-预测输出|)
sm.median_absolute_error(y, pred_y)
# R2得分,(0,1]区间的分值。分数越高,误差越小。
sm.r2_score(y, pred_y)

4. 保存与加载

import pickle
pickle.dump(内存对象, 磁盘文件) # 保存模型
model = pickle.load(磁盘文件)  # 加载模型

eg.

# 将训练好的模型对象保存到磁盘文件中
with open('../../data/linear.pkl', 'wb') as f:
    pickle.dump(model, f)
    
# 从磁盘文件中加载模型对象
with open('../../data/linear.pkl', 'rb') as f:
    model = pickle.load(f)
# 根据输入预测输出
pred_y = model.predict(x)

5.岭回归

为避免噪声样本(脱离在大部队之外)的影响,这些样本认为是偶然性造物
岭回归相较于普通的线性回归在损失函数后加了一个正则项,减少了噪声样本的影响

详细版本:
普通线性回归模型使用基于梯度下降的最小二乘法,在最小化损失函数的前提下,寻找最优模型参数,于此过程中,包括少数异常样本在内的全部训练数据都会对最终模型参数造成程度相等的影响,异常值对模型所带来影响无法在训练过程中被识别出来。为此,岭回归在模型迭代过程所依据的损失函数中增加了正则项,以限制模型参数对异常样本的匹配程度,进而提高模型面对多数正常样本的拟合精度。

一些说明:
0.当P=2时下图即是岭回归的损失函数
岭回归的损失函数:loss=((w0*x+w1-y)**2/2)+k
1.正则强度越大,曲线的拟合度越低,忽略噪音的效果越好

方法:

import sklearn.linear_model as lm
# 创建模型
model = lm.Ridge(正则强度,fit_intercept=是否训练截距, max_iter=最大迭代次数)
# 训练模型
# 输入为一个二维数组表示的样本矩阵
# 输出为每个样本最终的结果
model.fit(输入, 输出)
# 预测输出  
# 输入array是一个二维数组,每一行是一个样本,每一列是一个特征。
result = model.predict(array)

import sklearn.linear_model_ridge as lm
# 创建模型
model_ridge = lm.Ridge(正则强度,fit_intercept=是否训练截距, max_iter=最大迭代次数)
# 训练模型
# 输入为一个二维数组表示的样本矩阵
# 输出为每个样本最终的结果
model_ridge.fit(输入, 输出)
# 预测输出  
# 输入array是一个二维数组,每一行是一个样本,每一列是一个特征。
result = model_ridge.predict(array)

'''
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as plt

#训练
x, y = np.loadtxt('D:\BaiduNetdiskDownload\数据集 21.8\乔总结数据集\single.txt', delimiter=',', usecols=(0,1), unpack=True)
x = x.reshape(-1, 1)
model_ridge=lm.Ridge(100,fit_intercept=True,max_iter=800)
model_ridge.fit(x,y)
model_ridge.predict(x)
#得到模型
#测试
test_x=(np.linspace(x.min(),x.max(),500)).reshape(-1,1)
y_test=model_ridge.predict(test_x)

#训练
model_linear=lm.LinearRegression()
model_linear.fit(x,y)
model_linear.predict(x)
#得到模型
#测试
y_test_l=model_linear.predict(test_x)
#作图
plt.scatter(x,y,c='dodgerblue',alpha=0.75,s=60,label='sample')
plt.plot(test_x,y_test,c='orange',label='ridge regression')
plt.plot(test_x,y_test_l,c='red',label='linear regression')
plt.legend()
plt.show()

6.多项式回归

用多项式来进行更好的拟合
缺点:会过拟合

原理:y=w0 + w1 x + w2 x2 + w3 x3 + … + wd xd

将高次项看做对一次项特征的扩展得到:

y=w0 + w1 x1 + w2 x2 + w3 x3 + … + wd xd
故而一元多次转化为多元一次

所以一元多项式回归的实现需要两个步骤:

  1. 将一元多项式回归问题转换为多元线性回归问题(只需给出多项式最高次数即可)。
  2. 将1步骤得到多项式的结果中 w1 w2 … 当做样本特征,交给线性回归器训练多元线性模型。

方法:

import sklearn.pipeline as pl
import sklearn.preprocessing as sp
import sklearn.linear_model as lm

model = pl.make_pipeline(
    sp.PolynomialFeatures(num),  # 多项式特征扩展器,num为最高次数
    lm.LinearRegression())      # 线性回归器
#多项式回归
import numpy as np
import sklearn.preprocessing as sp
import sklearn.metrics as sm
import sklearn.linear_model as lm
import sklearn.pipeline as pl
import matplotlib.pyplot as plt

#训练
x, y = np.loadtxt('D:\BaiduNetdiskDownload\数据集 21.8\乔总结数据集\single.txt', delimiter=',', usecols=(0,1), unpack=True)
x=x.reshape(-1,1)
model=pl.make_pipeline(sp.PolynomialFeatures(5),lm.LinearRegression())
model.fit(x,y)
y_pred=model.predict(x)
#得到模型
#测试
test_x=(np.linspace(x.min(),x.max(),500)).reshape(-1,1)
y_test=model.predict(test_x)

print(sm.r2_score(y,y_pred))

#作图
plt.figure('Polynomial Regression',facecolor='lightgray')
plt.title('Polynomial Regression',fontsize=20)
plt.scatter(x,y,c='dodgerblue',alpha=0.75,s=60,label='sample')
plt.plot(test_x,y_test,c='orangered',label='regression')
plt.legend()
plt.show()

一点说明:
训练集R2   测试集R20.3        0.4        欠拟合:过于简单,无法反映数据的规则0.9        0.2        过拟合:过于复杂,太特殊,缺乏一般性0.7        0.6        可接受:复杂度适中,既反映数据的规则,同时又不失一般性

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 14:21:25  更:2021-08-14 14:23:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 17:15:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计