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

[数据结构与算法]线性回归(Linear regression)

? 最近在学习吴恩达老师的机器学习课程,所以在这里记录一下,主要是完成他的课后作业。

思路:
?1.首先,我们自己编写线性回归函数,看看整个计算的流程;
?2.使用sklearn进行线性回归计算;
?3.对比以上两种方法的优缺点。

1.单变量线性回归:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取文件地址,r将\转义为\\
path =  r'C:\Users\Administrator\Desktop\data1.txt'

# 指定哪一行作为表头。默认设置为0(即第一行作为表头),如果没有表头的话,要修改参数,设置header=None
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])

data.head()

在这里插入图片描述

data.describe()

在这里插入图片描述

data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))# 绘制散点图,figure size为图像大小设置
plt.show()

在这里插入图片描述

def computeCost(X, y, theta):
    inner = np.power(((X * theta.T) - y), 2)# np.power()函数表示求平方
    return np.sum(inner) / (2 * len(X)
data.insert(0, 'Ones', 1) # 在训练集中添加一列,以便可以使用向量化的解决方案来计算代价和梯度

补充:
1、img.shape:(300, 534, 3)

? img.shape[0]:图像的垂直尺寸(高度);对于矩阵来说,表示矩阵的行数,即 300
? img.shape[1]:图像的水平尺寸(宽度);对于矩阵来说,表示矩阵的列数,即 534
? img.shape[2]:图像的通道数,即 3
2、iloc[ : , : ]函数的使用:
? 前面的冒号就是取行数,后面的冒号是取列数

# set X (training data) and y (target variable)
cols = data.shape[1]# 输出矩阵的列数
X = data.iloc[:,0:cols-1]#X是所有行,去掉最后一列,即取Population列
y = data.iloc[:,cols-1:cols]#X是所有行,最后一列,即取Profit列
X.head()# head()是观察前5行
y.head()

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

# 代价函数是应该是numpy矩阵,所以需要转换X和Y,然后才能使用它们。还需要初始化theta。
# 将X,y转换为矩阵的形式
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0]))
theta # theta 是一个(1,2)矩阵
X.shape, y.shape, theta.shape  #检查一下维度

# ((97, 2), (97, 1), (1, 2))
computeCost(X, y, theta) # 计算代价函数

32.072733877455676

def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape)) # 生成与theta相同类型的全0矩阵!!!
    parameters = int(theta.ravel().shape[1]) # 将theta数组拉平为一维数组,即多维转一维
    cost = np.zeros(iters)
    
    for i in range(iters):
        error = (X * theta.T) - y
        
        for j in range(parameters):
            term = np.multiply(error, X[:,j])
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))
            
        theta = temp
        cost[i] = computeCost(X, y, theta)
        
    return theta, cost

补充:
numpy.zeros(shape, dtype=float)使用方法

? shape: 创建的新数组的形状(维度);
? dtype: 创建新数组的数据类型;如:dtype=np.int32;
? 返回值: 给定维度的全零数组。

# 初始化一些附加变量 :学习速率α和 迭代次数
alpha = 0.01
iters = 1000
# 运行梯度下降算法来将我们的参数θ适合于训练集
g, cost = gradientDescent(X, y, theta, alpha, iters)
g

matrix([[-3.24140214, 1.1272942 ]])

# 使用拟合的参数计算训练模型的代价函数(误差)
computeCost(X, y, g)

4.515955503078914

# 绘制线性模型以及数据
x = np.linspace(data.Population.min(), data.Population.max(), 100)
f = g[0, 0] + (g[0, 1] * x)

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Traning Data')
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=(12,8))
ax.plot(np.arange(iters), cost, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

在这里插入图片描述

2.多变量线性回归

path =  r'C:\Users\Administrator\Desktop\house prise.txt'
data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
data2.head()

在这里插入图片描述

# 特殊归一化处理
data2 = (data2 - data2.mean()) / data2.std()
data2.head()

在这里插入图片描述

# 按照例子1的方法进行数据处理
# add ones column
data2.insert(0, 'Ones', 1)

# set X (training data) and y (target variable)
cols = data2.shape[1]
X2 = data2.iloc[:,0:cols-1]
y2 = data2.iloc[:,cols-1:cols]

# convert to matrices and initialize theta
X2 = np.matrix(X2.values)
y2 = np.matrix(y2.values)
theta2 = np.matrix(np.array([0,0,0]))

# perform linear regression on the data set
g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)

# get the cost (error) of the model
computeCost(X2, y2, g2)

0.1307033696077189
此处的代价函数更小

# 查看训练进程
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost2, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

在这里插入图片描述

# 使用scikit-learn的线性回归函数,而不是从头开始实现这些算法
from sklearn import linear_model
model = linear_model.LinearRegression()
model.fit(X, y)
# scikit-learn model的预测表现
x = np.array(X[:, 1].A1)
f = model.predict(X).flatten()

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Traning Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-13 11:54:55  更:2022-05-13 11:56:17 
 
开发: 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 4:40:22-

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