【机器学习】线性回归ex1data1
发布日期:2021-06-29 19:46:29 浏览次数:2 分类:技术文章

本文共 3719 字,大约阅读时间需要 12 分钟。

单变量线性回归

题目:在本部分的练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。

您希望使用这些数据来帮助您选择将哪个城市扩展到下一个城市。

预备知识

一、损失函数
在这里插入图片描述
二、梯度下降
在这里插入图片描述

代码

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt#导入数据,并查看path = 'ex1data1.txt'# read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None,# squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None,# false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True,# na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False,# keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer',# thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, escapechar=None, comment=None,# encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0,# doublequote=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)# filepath_or_buffer - 您读取的文件路径,URL(包含http,ftp,s3)链接等# header - 指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。# names - 用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。data = pd.read_csv(path, header=None, names=['Population', 'Profit'])#定义代价函数J(θ)= 1/2m((∑i=1~m)(hθ(x(i))−y(i))^2)def computeCost(x, y, theta):    inner = ((x@theta) - y)**2    return np.sum(inner) / (2 * len(x))#训练集中在0列插入,一个列标签名为‘ones',数值为一列1data.insert(0, 'Ones', 1)#获取训练集数据"""data.iloc[0] - 得到属性名,第一行数据,数据类型data.iloc[1] - 得到属性名,第二行数据,数据类型data.iloc[:] / data.iloc[0:] / data.iloc[:, : ]- 得到全部数据data.iloc[1:] - 得到从第二行开始的数据data.iloc[2:, 3:] - 得到3-最后一行,4到最后一列数据matrix的优势就是相对简单的运算符号,比如两个矩阵相乘,就是用符号*,但是array相乘不能这么用,得用方法.dot()array的优势就是不仅仅表示二维,还能表示3、4、5…维,而且在大部分Python程序里,array也是更常用的。两者区别:对应元素相乘:matrix可以用np.multiply(X2,X1),array直接X1*X2点乘:matrix直接X1*X2,array可以 X1@X2 或 X1.dot(X2) 或 np.dot(X1, X2)"""# 得到所有行的从第一列到倒数第二列的数据,(values)并形成列表,即输入向量x = data.iloc[:, :-1].values# 得到所有行最后一列的数据,(values)并形成列表,即目标向量y = data.iloc[:, -1].values# shape - 它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。shape的输入参数可以是一个整数(表示维度),也可以是一个矩阵。# zeros(shape, dtype=float, order='C') - 返回:返回来一个给定形状和类型的用0填充的数组;theta : [0. 0.]theta = np.zeros(x.shape[1])#检查维度,分别为:# x - (97, 2) - 97维(行), 每个维度长度为2.# theta - (2,) - 2维(行),每个维是数字,不是数组,没有长度# y - (97,) - 97维(行),每个维是数字,不是数组,没有长度#定义梯度下降函数(theta初始值为0)def gradient(x, y, theta, alpha, epoch):    # m是样本的数量    m = len(y)    # 初始化一个ndarray,包含每次epoch的cost    cost = np.zeros(epoch)    for i in range(epoch):        theta = theta-(alpha/m)*((x@theta-y).T@x)        cost[i] = computeCost(x, y, theta)    return theta, cost#计算最终theta值,alpha - 学习率,epoch - theta迭代次数alpha = 0.01epoch = 1000theta, cost = gradient(x, y, theta, alpha, epoch)# fig为返回的图像,ax为返回的坐标系(为一个数组)fig, ax = plt.subplots(figsize=(6, 4))# arange()类似于内置函数range(),通过指定开始值、终值和步长创建表示等差数列的一维数组,注意得到的结果数组不包含终值。# linspace()通过指定开始值、终值和元素个数创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值x = np.linspace(data.Population.min(), data.Population.max(), 100) #设置直线x坐标的数据集y = theta[0]+theta[1]*x  #设置直线y坐标的数据集 - y = θ0 + θ1 * x (y=ax+b)# 画回归直线ax.plot(x, y, color='red', label='Prediction')# 画训练集的点,前两个参数是点的x和y坐标的数据集ax.scatter(data.Population, data.Profit, label='Traning Data')#点和线的图例,2表示在左上角。不写这句的话图例出现不了ax.legend(loc=2)#接下来设置坐标轴名称和图题ax.set_xlabel('Population')ax.set_ylabel('Profit')ax.set_title('Predicted Profit vs. Population Size')plt.show()# 损失函数fig, ax = plt.subplots(figsize=(8, 4))ax.plot(np.arange(epoch), cost, color = 'red')  # np.arange()返回等差数组ax.set_xlabel('Iterations')ax.set_ylabel('Cost')ax.set_title('Error vs. Training Epoch')plt.show()

结果

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

转载地址:https://darkness.blog.csdn.net/article/details/109338405 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【机器学习】线性回归ex1data2
下一篇:Python3网络爬虫数据采集(4~6)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月26日 18时35分55秒