机器学习实训 Day1(线性回归练习)

线性回归练习 Day1

手搓线性回归

随机初始数据

import numpy as np
x = np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74])
y = np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])
from matplotlib import pyplot as plt
# 内嵌显示
%matplotlib inlineplt.scatter(x, y)
plt.xlabel("arear")
plt.ylabel("price")
Text(0, 0.5, 'price')


image-20240410201652825

# 定义线性模型
def f(x ,w0, w1):y = w0 +w1*xreturn y
# 定义平方损失函数
def loss(x, y, w0, w1):loss = sum(np.square(y-(w0 +w1*x)))return loss

最小二乘法 — 定义为:
f = ∑ i = 1 n ( y i − ( w 0 + w 1 x i ) ) 2 f = \sum\limits_{i = 1}^n {{{(y_{i}-(w_0 + w_1x_{i}))}}^2} f=i=1n(yi(w0+w1xi))2
对loss 求w0 和w1 的偏微分,解方程组可得
w 1 = n ∑ x i y i − ∑ x i ∑ y i n ∑ x i 2 − ( ∑ x i ) 2 w_{1}=\frac {n\sum_{}^{}{x_iy_i}-\sum_{}^{}{x_i}\sum_{}^{}{y_i}} {n\sum_{}^{}{x_i}^2-(\sum_{}^{}{x_i})^2} w1=nxi2(xi)2nxiyixiyi

w 0 = ∑ x i 2 ∑ y i − ∑ x i ∑ x i y i n ∑ x i 2 − ( ∑ x i ) 2 w_{0}=\frac {\sum_{}^{}{x_i}^2\sum_{}^{}{y_i}-\sum_{}^{}{x_i}\sum_{}^{}{x_iy_i}} {n\sum_{}^{}{x_i}^2-(\sum_{}^{}{x_i})^2} w0=nxi2(xi)2xi2yixixiyi

# 使用代码实现上述过程 -- 求解最优的w0 和w1
def culculate_w(x, y):n = len(x)w1 = (n*sum(x*y) - sum(x)*sum(y))/(n*sum(x*x) - sum(x)*sum(x))w0 = (sum(x*x)*sum(y) - sum(x)*sum(x*y))/(n*sum(x*x)-sum(x)*sum(x))return w0, w1
culculate_w(x, y)
(41.33509168550616, 0.7545842753077117)
w0 = culculate_w(x, y)[0]
w1 = culculate_w(x, y)[1]
x_temp = np.linspace(50, 120, 100)
plt.scatter(x, y)
%time plt.plot(x_temp, x_temp*w1+w0, "r")
Wall time: 0 ns


image-20240410201707253

假设我有一个100平米的房子要售出,则可以表示为:

f(100, w0, w1)
116.79351921627732

使用scikit -learn 实现

sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)

  • fit_intercept: 默认为 True,计算截距项。
  • normalize: 默认为 False,不针对数据进行标准化处理。
  • copy_X: 默认为 True,即使用数据的副本进行操作,防止影响原数据。
  • n_jobs: 计算时的作业数量。默认为 1,若为 -1 则使用全部 CPU 参与运算。
from sklearn.linear_model import LinearRegression
model = LinearRegression()# 训练, reshape 操作把数据处理成 fit 能接受的形状
model.fit(x.reshape(len(x), 1), y)
# 截距项和系数
model.intercept_,model.coef_
(41.33509168550615, array([0.75458428]))
model.predict([[100]])
array([116.79351922])

最小二乘法的矩阵推导(方便运算)

首先,一元线性函数的表达式为 $ y(x, w) = w_0 + w_1x$,表达成矩阵形式为:
[ 1 , x 1 1 , x 2 ⋯ 1 , x 9 1 , x 10 ] [ w 0 w 1 ] = [ y 1 y 2 ⋯ y 9 y 10 ] ⇒ [ 1 , 56 1 , 72 ⋯ 1 , 94 1 , 74 ] [ w 0 w 1 ] = [ 92 102 ⋯ 105 92 ] (8a) \left[ \begin{array}{c}{1, x_{1}} \\ {1, x_{2}} \\ {\cdots} \\ {1, x_{9}} \\ {1, x_{10}}\end{array}\right] \left[ \begin{array}{c}{w_{0}} \\ {w_{1}}\end{array}\right] = \left[ \begin{array}{c}{y_{1}} \\ {y_{2}} \\ {\cdots} \\ {y_{9}} \\ {y_{10}}\end{array}\right] \Rightarrow \left[ \begin{array}{c}{1,56} \\ {1,72} \\ {\cdots} \\ {1,94} \\ {1,74}\end{array}\right] \left[ \begin{array}{c}{w_{0}} \\ {w_{1}}\end{array}\right]=\left[ \begin{array}{c}{92} \\ {102} \\ {\cdots} \\ {105} \\ {92}\end{array}\right] \tag{8a} 1,x11,x21,x91,x10 [w0w1]= y1y2y9y10 1,561,721,941,74 [w0w1]= 9210210592 (8a)

y ( x , w ) = X W (8b) y(x, w) = XW \tag{8b} y(x,w)=XW(8b)
( 8 ) (8) (8) 式中, W W W [ w 0 w 1 ] \begin{bmatrix}w_{0} \\ w_{1} \end{bmatrix} [w0w1],而 X X X 则是 [ 1 , x 1 1 , x 2 ⋯ 1 , x 9 1 , x 10 ] \begin{bmatrix}1, x_{1} \\ 1, x_{2} \\ \cdots \\ 1, x_{9} \\ 1, x_{10} \end{bmatrix} 1,x11,x21,x91,x10 矩阵。然后,平方损失函数为:
f = ∑ i = 1 n ( y i − ( w 0 + w 1 x i ) ) 2 = ( y − X W ) T ( y − X W ) (9) f = \sum\limits_{i = 1}^n {{{(y_{i}-(w_0 + w_1x_{i}))}}}^2 =(y-XW)^T(y-XW)\tag{9} f=i=1n(yi(w0+w1xi))2=(yXW)T(yXW)(9)
通过对公式 ( 9 ) (9) (9) 实施矩阵计算乘法分配律得到:
在该公式中 y y y X W XW XW 皆为相同形式的 ( m , 1 ) (m,1) (m,1) 矩阵,由此两者相乘属于线性关系,所以等价转换如下:
f = y T y − ( X W ) T y − ( X W ) T y + ( X W ) T ( X W ) = y T y − 2 ( X W ) T y + ( X W ) T ( X W ) (11) f = y^{T}y - (XW)^{T}y - (XW)^{T}y + (XW)^{T}(XW)\\ = y^{T}y - 2 (XW)^{T}y + (XW)^{T}(XW) \tag{11} f=yTy(XW)Ty(XW)Ty+(XW)T(XW)=yTy2(XW)Ty+(XW)T(XW)(11)

∂ f ∂ W = 2 X T X W − 2 X T y = 0 (12) \frac{\partial f}{\partial W}=2X^TXW-2X^Ty=0 \tag{12} Wf=2XTXW2XTy=0(12)

当矩阵 X T X X^TX XTX 满秩时, ( X T X ) − 1 X T X = E (X^TX)^{-1}X^TX=E (XTX)1XTX=E,且 E W = W EW=W EW=W。所以有 ( X T X ) − 1 X T X W = ( X T X ) − 1 X T y (X^TX)^{-1}X^TXW=(X^TX)^{-1}X^Ty (XTX)1XTXW=(XTX)1XTy,并最终得到:
W = ( X T X ) − 1 X T y (13) W=(X^TX)^{-1}X^Ty \tag{13} W=(XTX)1XTy(13)

def w_matrix(x, y):w = (x.T *x).I*x.T*yreturn w
# 这里给截距系数加1
# 为什么?
x = np.matrix([[1, 56], [1, 72], [1, 69], [1, 88], [1, 102],[1, 86], [1, 76], [1, 79], [1, 94], [1, 74]])
x
matrix([[  1,  56],[  1,  72],[  1,  69],[  1,  88],[  1, 102],[  1,  86],[  1,  76],[  1,  79],[  1,  94],[  1,  74]])
y = np.matrix([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])
y
matrix([[ 92, 102,  86, 110, 130,  99,  96, 102, 105,  92]])
y.reshape(10, 1)
matrix([[ 92],[102],[ 86],[110],[130],[ 99],[ 96],[102],[105],[ 92]])
w_matrix(x, y.reshape(10, 1))  #这里注意一下这个reshape的函数,可以简单介绍一下
matrix([[41.33509169],[ 0.75458428]])

实战之波士顿房价

import pandas as pd
df = pd.read_csv("https://labfile.oss.aliyuncs.com/courses/1081/course-5-boston.csv")
df.head()
crimzninduschasnoxrmagedisradtaxptratioblacklstatmedv
00.0063218.02.3100.5386.57565.24.0900129615.3396.904.9824.0
10.027310.07.0700.4696.42178.94.9671224217.8396.909.1421.6
20.027290.07.0700.4697.18561.14.9671224217.8392.834.0334.7
30.032370.02.1800.4586.99845.86.0622322218.7394.632.9433.4
40.069050.02.1800.4587.14754.26.0622322218.7396.905.3336.2
  • CRIM: 城镇犯罪率。
  • ZN: 占地面积超过 2.5 万平方英尺的住宅用地比例。
  • INDUS: 城镇非零售业务地区的比例。
  • CHAS: 查尔斯河是否经过 (=1 经过,=0 不经过)。
  • NOX: 一氧化氮浓度(每 1000 万份)。
  • RM: 住宅平均房间数。
  • AGE: 所有者年龄。
  • DIS: 与就业中心的距离。
  • RAD: 公路可达性指数。
  • TAX: 物业税率。
  • PTRATIO: 城镇师生比例。
  • BLACK: 城镇的黑人指数。
  • LSTAT: 人口中地位较低人群的百分数。
  • MEDV: 城镇住房价格中位数。

以下是双中括号和单中括号用法的区别:

  • df[‘column_name’]:这将返回df中名为’column_name’的列作为一个Series对象。
  • df[[‘column_name’]]:即使只选择了一列,这也将返回一个包含单个列的DataFrame对象。
  • df[[‘column1’, ‘column2’, …]]:这将返回一个包含多个列的新DataFrame对象。
# 选择特征并进行描述
# 注意这里的特征选择哈,需要用双中括号
features = df[['crim', 'black', 'rm']]
features
这里看出df 是一个矩阵哈
crimblackrm
00.00632396.906.575
10.02731396.906.421
20.02729392.837.185
30.03237394.636.998
40.06905396.907.147
............
5010.06263391.996.593
5020.04527396.906.120
5030.06076396.906.976
5040.10959393.456.794
5050.04741396.906.030

506 rows × 3 columns

# 这个函数好啊 df.describe()
features.describe()
crimblackrm
count506.000000506.000000506.000000
mean3.593761356.6740326.284634
std8.59678391.2948640.702617
min0.0063200.3200003.561000
25%0.082045375.3775005.885500
50%0.256510391.4400006.208500
75%3.647423396.2250006.623500
max88.976200396.9000008.780000
target = df['medv']  # 目标值数据
pd.concat([features, target], axis = 1).head()
crimblackrmmedv
00.00632396.906.57524.0
10.02731396.906.42121.6
20.02729392.837.18534.7
30.03237394.636.99833.4
40.06905396.907.14736.2
  • pd.concat()是pandas库中用于合并两个或多个pandas对象的函数。
  • axis=1参数指定了合并的方向,axis=1表示沿着水平轴合并,即将target添加为features旁边的新列。
target = df['medv']  # 目标值数据
pd.concat([features, target], axis = 1).head()
split_num = int(len(features)*0.8)  # 得到 70% 位置
# 巧用切片
X_train = features[:split_num]  # 训练集特征
y_train = target[:split_num]  # 训练集目标
X_test = features[split_num:]  # 测试集特征
y_test = target[split_num:]  # 测试集目标
# 建立模型 这里x 和y 都是矩阵哈
model = LinearRegression()
model.fit(X_train, y_train)
model.intercept_, model.coef_
(-32.144190320694356,array([-2.56053360e-01, -2.08542666e-03,  9.09551839e+00]))
preds = model.predict(X_test)  # 输入测试集特征进行预测
preds  # 预测结果
array([ 6.84236606,  1.35146498, -0.58345448, 15.11080818, 16.39338694,26.10728436,  7.11979357, 24.73385248,  5.07320962,  6.96583067,-2.93906591, 21.68892456, 26.72249946,  9.19066152,  3.17485413,26.79800917, 22.66348233, 20.01804056, 15.53430933, 21.55521943,16.21350586, 17.40588695, 17.75900807, 14.583511  , 22.0962585 ,23.36733576, 23.24569317, 27.25939339, 24.44022716, 24.75657544,20.54835856, 25.06325907, 22.87213135, 19.90582961, 18.19159772,15.80408347, 14.31093718, 22.82690027, 22.14476301, 23.48178335,17.3213156 , 26.34194786, 23.25722383, 21.360374  , 20.89514026,23.66028342, 27.5207012 , 26.25233117, 23.02385692, 32.20317668,26.60052985, 25.88101696, 20.99330272, 19.73972181, 22.61401255,20.59648876, 27.04045293, 24.08690317, 22.7804789 , 24.78311323,21.49489332, 18.72948302, 20.9798386 , 20.63298594, 16.99866114,15.64287713, 22.00664348, 22.65331358, 24.66954478, 29.3713086 ,14.41919617, 21.63403039, 24.75754314, 11.52283228, 20.69956041,20.04221596, 22.31107232, 26.96924151, 29.78745483, 18.72312515,19.8734271 , 23.51562772, 21.18951208, 19.5170519 , 16.60020756,16.33450271, 13.46210161, 21.43367535, 21.41808652, 18.8918507 ,20.856561  , 18.56139052, 15.97879492, 19.6588178 , 21.71280156,17.63786833, 21.78933994, 26.98905942, 22.68108487, 30.46288234,28.80218963, 21.86194026])
def mae_value(y_true, y_pred):n = len(y_true)mae = sum(np.abs(y_true - y_pred))/nreturn mae
def mse_value(y_true, y_pred):n = len(y_true)mse = sum(np.square(y_true - y_pred))/nreturn mse
mae = mae_value(y_test.values, preds)
mse = mse_value(y_test.values, preds)print("MAE: ", mae)
print("MSE: ", mse)
MAE:  6.332365508141984
MSE:  59.89375772584887

这主要是因为我们没有针对数据进行预处理。上面的实验中,我们随机选择了 3 个特征,并没有合理利用数据集提供的其他特征。除此之外,也没有针对异常数据进行剔除以及规范化处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/310244.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Uniapp+基于百度智能云完成AI视觉功能(附前端思路)

本博客使用uniapp百度智能云图像大模型中的AI视觉API(本文以物体检测为例)完成了一个简单的图像识别页面,调用百度智能云API可以实现快速训练模型并且部署的效果。 uniapp百度智能云AI视觉页面实现 先上效果图实现过程百度智能云Easy DL训练图…

Redis消息队列-基于PubSub的消息队列

7.3 Redis消息队列-基于PubSub的消息队列 PubSub(发布订阅)是Redis2.0版本引入的消息传递模型。顾名思义,消费者可以订阅一个或多个channel,生产者向对应channel发送消息后,所有订阅者都能收到相关消息。 SUBSCRIBE …

SpringMVC:搭建第一个web项目并配置视图解析器

👉需求:用spring mvc框架搭建web项目,通过配置视图解析器达到jsp页面不得直接访问,实现基本的输出“hello world”功能。👩‍💻👩‍💻👩‍💻 1 创建web项目 1…

Knowledge Editing for Large Language Models: A Survey

目录 IntroductionProblem Formulation评估指标Methods数据集应用讨论挑战未来方向 大型语言模型(LLMS)最近由于其出色的理解,分析和生成文本的能力而根据其广泛的知识和推理能力来改变了学术和工业景观。然而,LLM的一个主要缺点是…

如何在横向渗透攻击中寻到一线生机

横向渗透,作为计算机网络中的一种攻击技术,展现出了攻击者如何巧妙地利用同一级别系统间的漏洞和弱点,扩大其网络访问权限。与纵向渗透不同,横向渗透不关注权限的垂直提升,而是更侧重于在同一层级内扩展影响力。 横向…

Excel文件解析

在此模块的学习中,我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是:解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析,将文件直接加载到内存,所以速度比较快,适合Excel文件数据量不…

Appium知多少

Appium我想大家都不陌生,这是主流的移动自动化工具,但你对它真的了解么?为什么很多同学搭建环境时碰到各种问题也而不知该如何解决。 appium为什么英语词典查不到中文含义? appium是一个合成词,分别取自“applicatio…

JavaEE企业开发新技术5

目录 2.18 综合应用-1 2.19 综合应用-2 2.20 综合应用-3 2.21 综合应用-4 2.22 综合应用-5 Synchronized : 2.18 综合应用-1 反射的高级应用 DAO开发中,实体类对应DAO的实现类中有很多方法的代码具有高度相似性,为了提供代码的复用性,降低…

Mac电脑安装蚁剑

1: github 下载源码和加载器:https://github.com/AntSwordProjectAntSwordProject GitHubAntSwordProject has 12 repositories available. Follow their code on GitHub.https://github.com/AntSwordProject 以该图为主页面:antSword为源码…

Flask快速搭建文件上传服务与接口

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 一、需求背景 前端通过浏览器,访问后端服务器地址,将目标文件进行上传。 访问地址:http://127.0.0…

内网渗透-内网环境下的横向移动总结

内网环境下的横向移动总结 文章目录 内网环境下的横向移动总结前言横向移动威胁 威胁密码安全 威胁主机安全 威胁信息安全横向移动威胁的特点 利用psexec 利用psexec.exe工具msf中的psexec 利用windows服务 sc命令 1.与靶机建立ipc连接2.拷贝exe到主机系统上3.在靶机上创建一个…

ClickHouse 介绍

前言 一个通用系统意味着更广泛的适用性,但通用的另一种解释是平庸,因为它无法在所有场景内都做到极致。 ClickHouse 在没有像三驾马车这样的指导性论文的背景下,通过针对特定场景的极致优化,获得闪电般的查询性能。 ClickHous…

C++_第五周做题总结_构造与析构

id:31 A.Point(类与构造) 题目描述 下面是一个平面上的点的类定义,请在类外实现它的所有方法,并生成点测试它。 class Point {double x, y; public:Point(); // 缺省构造函数,给x,y分别赋值为0Point(double x_value…

JAVAEE——网络初始

文章目录 网络发展史独立模式网络模式局域网LAN路由器的诞生 网络通信的基础IP地址端口号 认识协议OSI七层模型TCP/IP五层模型 网络发展史 独立模式 在原始的年代中电脑间想要通信需要两台电脑连接一根网线,但是一台电脑基本上只有一个接口。因此想要链接更多的电…

HCIP课后习题之一

1、路由协议用工作机制上分为那几种?分别是? A:两种。分别是静态路由和动态路由(可分为IGP和EGP) 2、IGP和EGP协议有哪些? A:IGP: RIP、OSPF、ISIS、EIGRP EGP: BGP 3、路由优先级的用途&…

自动化测试selenium(2)

目录 WebDriver介绍 WebDriver使用 使用WebDriver驱动操作浏览器(打开一个百度) WebDriver 相关API 定位元素 操作元素 上一篇主要介绍了自动化测试的概念以及selenium的基本原理, 这里我们来讲一下如何利用selenium来写测试用的脚本. WebDriver介绍 Selenium是一个用于…

1043: 利用栈完成后缀表达式的计算

解法&#xff1a; #include<iostream> #include<stack> using namespace std; int main() {char a;stack<int> sk;while (cin >> a && a ! #) {if (a > 0 && a < 9) {sk.push(a - 0);}else {int num2 sk.top();sk.pop();int n…

javaWeb项目-外面点餐系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …

书生·浦语大模型全链路开源体系-第3课

书生浦语大模型全链路开源体系-第3课 书生浦语大模型全链路开源体系-第3课相关资源RAG 概述在 InternLM Studio 上部署茴香豆技术助手环境配置配置基础环境下载基础文件下载安装茴香豆 使用茴香豆搭建 RAG 助手修改配置文件 创建知识库运行茴香豆知识助手 在茴香豆 Web 版中创建…

逆向IDA中Dword,数据提取

我们可以看见数据是这样的&#xff0c;第一个是1cc 但是我们shifte就是 这个因为他的数据太大了&#xff0c;导致高位跑后面去了 这个时候&#xff0c;我们右键——convert——dword 这样就可以提取到争取的数据了 比如第一个数据 0x1cc a0xcc b0x1 print(hex((b<<8…