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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 机器学习---线性回归 -> 正文阅读

[数据结构与算法]机器学习---线性回归

一元线性回归模型

? 一元线性回归顾名思义自变量的个数为1个,因变量的个数也是1个。需要我们根据训练数据去学得一个线性模型以尽可能的准确的预测实值的输出。
f ( x ) = w X + b f(x)=wX+b f(x)=wX+b
? 那么我们如何去确定w和b的值呢?根据衡量预测值与实际值之间的区别,我们可以令均方误差最小化。基于这种均方误差最小化来进行模型求解的方法成为最小二乘法。

? 对目标函数分别对w和b求导,并令导数为0,即可解出w和b的值。也可以使用梯度下降法,求出w和b。案例1为使用梯度下降法求解,案例2(鸢尾花)和案例3(波士顿房价)为使用sklearn封装好的函数去拟合。

###################################线性回归#########################################
#还是以y = wx + b为例
import matplotlib.pyplot as plt
 
x = [14.1,15.1,16.1,15.3,14.2,14.5,14.6,14.8,16.3,16.6,15.6,16.7,14.7,16.2,16.7,14.8,14.9,15.9,16.3,17.0,15.0,16.3,17.1,16.0,17.2,17.4,15.5,16.8,17.4,16.9]
y = [15.8,16.3,14.5,16.6,16.7,15.0,14.9,15.2,15.3,16.6,17.0,16.4,16.5,15.4,15.8,14.8,16.0,17.3,15.7,14.4,15.8,16.7,14.9,16.9,15.5,16.6,17.7,18.0,15.9,18.0]
#这里是我随便创造的数据,一共30个
 
#这里我将数据分为了训练集和测试集
x_train = x[0:20]
y_train = y[0:20]
 
x_test = x[20:]
y_test = y[20:]
 
#给参数w和b的初始值分别为1.0和-1.0,以及学习率为0.0001,求10000次参数
w_start = 1.0
b_start = -1.0
learn = 0.0001
times = 10000
 
for i in range(times):
    sum_w = 0
    sum_b = 0
    
    #这里就是我们的梯度下降法,通过它,使我们的损失函数变小,求出我们要的新参数w和b
    for i in range(len(x_train)):
        sum_w += (y_train[i] - w_start * x_train[i]-b_start) * (-x_train[i])
        sum_b += (y_train[i] - w_start * x_train[i]-b_start) * (-1)
    
    w_start = w_start - 2 * sum_w * learn
    b_start = b_start - 2 * sum_b * learn
 
plt.figure(figsize=(20,8))#改变图片大小
plt.scatter(x_train, y_train,c='r')#画出我们训练集的散点图
plt.plot([i for i in range(0,20)],[(w_start * i + b_start) for i in range(0,20)])#画出我们通过梯度下降法求出来的新的参数w,b的y = wx + b的直线图
plt.show()
 
#下面这里是为了检测我得出的线性回归模型理想程度
 
#这是训练集的所有真实数据与我模型(y=wx+b)相减得出来的误差值
total_train_loss = 0
for i in range(len(x_train)):
    y_hat = w_start * x_train[i] + b_start
    total_train_loss += (y_train[i] - y_hat) ** 2
print("训练集的误差:"+str(total_train_loss))
 
#这是测试集的所有真实数据与我模型(y=wx+b)相减得出来的误差值
total_test_loss = 0
for i in range(len(x_test)):
    y_hat = w_start * x_test[i] + b_start
    total_test_loss += (y_test[i] - y_hat) ** 2
print("测试集的误差:"+str(total_test_loss))
import numpy as np
import matplotlib.pyplot as plt
#用于线性回归的类
from sklearn.linear_model import LinearRegression
#用来切分训练集与测试集
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
#使用precision设置输出精度。默认为8,此处设置为2。
np.set_printoptions(precision=2)
#加载鸢尾花数据 其中包括data和target,data为鸢尾花的四个特征,target为鸢尾花的三个种类(0,1,2)
iris = load_iris()
#获取花瓣长度作为x,花瓣宽度作为y。
x = iris.data[:,2].reshape(-1,1)  #reshape函数可以将数据重新组织转化为1列n行
y = iris.data[:,3];
#LinearRegression()的参数如下:
#fit_intercept:是否有截据,如果没有则直线过原点;
#normalize:是否将数据归一化;
#copy_X:默认为True,当为True时,X会被copied,否则X将会被覆写;
#n_jobs:默认值为1。计算时使用的核数
lr = LinearRegression()  #创建一个回归对象
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)  #random_state随机数种子
#就好像是在系统中已经有了一个0~RAND_MAX的一个乱序序列,我们调用rand()的时候都是参照这个序列和随机种子的,这里没有设置随机种子,因此随机种子为1,当随机种子为x的时候,我们可以根据这个随机种子x来计算出一个随机数f(x, m),其中m为这个序列中的伪随机数。如果随机种子是固定的,那么每次调用rand()依然可以计算出来了。
#使用训练集数据,训练模型。
lr.fit(x_train, y_train)
print('权重:', lr.coef_)
print('截距:', lr.intercept_)
y_hat = lr.predict(x_test)
print('实际值:', y_test[:45])
print('预测值:', y_hat[:45])
sum = 0;
for i in range(0,len(y_hat)):
    sum = sum + (y_hat[i]-y_test[i])**2;
print('误差平方和为:',sum);
#plt.figure(figsize=(10,6));
plt.legend();
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.scatter(x_train,y_train,c='r',label='训练集');
plt.scatter(x_test,y_test,c='g',label='测试集');
plt.plot(x,x*lr.coef_+lr.intercept_,c='orange');
plt.xlabel('花瓣长度');
plt.ylabel('花瓣宽度');
plt.show();
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np;
boston = load_boston()
x = boston.data;
y = boston.target;
df = pd.DataFrame(np.concatenate([x, y.reshape(-1,1)], axis=1),columns = boston.feature_names.tolist()+['MEDV'])
print(df.head());
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=0);
lr = LinearRegression();
lr.fit(x_train,y_train);
y_hat = lr.predict(x_test);
sum = 0;
for i in range(0,len(y_hat)):
    sum = sum + (y_hat[i]-y_test[i])**2;
print('误差平方和为:',sum);
plt.legend();
plt.rcParams['font.sans-serif']=['SimHei'];
plt.rcParams['axes.unicode_minus']=False;
plt.plot(y_test,c='r',label='实际值');
plt.plot(y_hat,c='b',label='预测值');
plt.show();
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 19:01:27  更:2022-04-22 19:06:05 
 
开发: 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年11日历 -2024/11/26 7:17:56-

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