[Machine learning] linear regression ex1

Univariate linear regression

Topic : In this part of the exercise, you will use a variable to implement linear regression to predict the profit of a food truck. Suppose you are the CEO of a restaurant and you are considering opening a new branch in a different city. The chain already has trucks in various cities, and you have profit and population data from the cities.
You want to use this data to help you choose which city to expand to the next city.

Preliminary knowledge
one, loss function
Insert picture description here
two, gradient descent
Insert picture description here

Code

import numpy as np
import pandas as pd
import 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',数值为一列1
data.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.01
epoch = 1000
theta, 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()

result
Insert picture description here
Insert picture description here

Guess you like

Origin blog.csdn.net/weixin_44485744/article/details/109338405
Recommended