机器学习实训 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 inline

plt.scatter(x, y)
plt.xlabel("arear")
plt.ylabel("price")
Text(0, 0.5, 'price')


image-20240410201652825

# 定义线性模型
def f(x ,w0, w1):
    y = w0 +w1*x
    return 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*y
    return 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))/n
    return mae
def mse_value(y_true, y_pred):
    n = len(y_true)
    mse = sum(np.square(y_true - y_pred))/n
    return 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 个特征,并没有合理利用数据集提供的其他特征。除此之外,也没有针对异常数据进行剔除以及规范化处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android自定义控件ScrollView实现上下滑动功能

本文实例为大家分享了Android ScrollView实现上下滑动功能的具体代码,供大家参考,具体内容如下 package com.example.zhuang; import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; import android…

什么是生成式AI?有哪些特征类型

生成式AI是人类一种人工智能技术,可以生成各种类型的内容,包括文本、图像、音频和合成数据。那么什么是人工智能?人工智能和机器学习之间的区别是什么?有哪些技术特征? 人工智能是一门学科,是计算机科学的一…

日志监控思路分享,只监控日志内容,不存储

有一个这样的需求,就是实时监控日志文件的内容,不需要存储,仅当某行日志内容触发某个规则时调用一段业务逻辑就行了。比如用户触发限流规则,就将其封禁并发送钉钉通知到运维群。 看到这个需求首先想到的就是日志采集工具&#xff…

【ARM 裸机】汇编 led 驱动之原理分析

1、我们为什么要学习汇编??? 之前我们或许接触过 STM32 以及其他的 32 位的 MCU ,都是基于 C 语言环境进行编程的,都没怎么注意汇编,是因为 ST 公司早已将启动文件写好了,新建一个 STM32 工程的时候&#…

网站HTTP升级成为HTTPS的方法

将网站从HTTP免费升级为HTTPS,您可以按照以下步骤操作: 1. 选择证书颁发机构(CA): - 为了免费升级,您可以选择使用JoySSL这样的公益项目。JoySSL提供免费、自动化的SSL/TLS证书颁发服务,适用于各…

HAL STM32F4内部温度读取+ADC阻塞式读取

HAL STM32F4内部温度读取ADC阻塞式读取 📍相关篇《STM32F103VET6基于STM32CubeMX 配置非DMA方式获取内部温度》 🔖对于大多数stm32型号,基本上内部都集成了温度传感器。 ⛳不同型号的STM32单片机,计算温度的公式差异 &#x1f33f…

Vue2和Vue3组件通信:父子与兄弟间的桥梁

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

网盘——登录跳转

在界面设计这块,当登录界面上输入的账号和密码都正确的情况下,直接跳转到好友界面,否则不跳转 1、在opewidget.h里面定义一个单例模式 static OpeWidget &getInstance(); 2、添加定义 产生一个静态的操作界面的对象。操作界面这个对象他…

《零秒思考》像麦肯锡精英一样思考 - 三余书屋 3ysw.net

零秒思考:像麦肯锡精英一样思考 大家好,今天我们要深入探讨的著作是《零秒思考》。在领导提出问题时,我们常常会陷入沉思,却依然难以有所进展,仿佛原地踏步,但是身边的同事却能够立即给出清晰的回答。这种…

Rust面试宝典第1题:爬楼梯

题目 小乐爬楼梯,一次只能上1级或者2级台阶。楼梯一共有n级台阶,请问总共有多少种方法可以爬上楼? 解析 这道题虽然是一道编程题,但实际上更是一道数学题,着重考察应聘者的逻辑思维能力和分析解决问题的能力。 当楼梯只…

Web路径专题

文章目录 1.资源定位1.前置条件上下文路径设置 2.上下文路径介绍重点说明 3.资源定位方式资源路径 上下文路径 资源位置a.html定位C.java定位 4.浏览器和服务器解析的区别1.浏览器解析/(地址变化)2.服务器解析/(地址不变) 5.带/…

华为ensp中PPP(点对点协议)中的CHAP认证 原理和配置命令

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月11日6点00分 PPP协议(Point-to-Point Protocol)是点到点协议,是一种常用的串行链路层协议,用于在两个节点之间建立点…

结合 tensorflow.js 、opencv.js 与 Ant Design 创建美观且高性能的人脸动捕组件并发布到InsCode

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图tensorflow.js 使用 opencv.js 将人脸…

PTA 2813:画家问题(熄灯问题)

有一个正方形的墙,由NN个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i,j)个位置的砖时, 位置(i−1,j)、 (i1,j)、(i,j−1)、(i…

HJ13 句子逆序(句子反序,再把单词反序)

句子反序,再把单词反序 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别String s sc.n…

本地化部署离线开源免费语音识别API,支持多模态AI能力引擎

思通数科作为一家专注于多模态AI能力开源引擎平台,其技术产品涵盖了自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别以及语音识别等多个领域。在语音识别这一细分市场,思通数科的技术产品中的音频文件转写服务有着相似的应用场景和功能特点。…

如何将powerpoint(PPT)幻灯片嵌入网页中在线预览、编辑并保存到服务器?

猿大师办公助手不仅可以把微软Office、金山WPS和永中Office的Word文档、Excel表格内嵌到浏览器网页中实现在线预览、编辑保存等操作,还可以把微软Office、金山WPS和永中Office的PPT幻灯片实现网页中在线预览、编辑并保存到服务器。 猿大师办公助手把本机原生Office…

【开发篇】十三、JVM基础参数设置与垃圾回收器的选择

文章目录 1、-Xmx 和 –Xms2、-XX:MaxMetaspaceSize 和 –XX:MetaspaceSize3、-Xss4、不建议改的参数5、其他参数6、选择GC回收器的调试思路7、CMS的并发模式失败现象的解决8、调优案例 GC问题解决方式: 优化JVM基础参数,避免频繁Full GC减少对象的产生…

设计模式学习笔记 - 设计模式与范式 -行为型:9.迭代器模式(上):相比直接遍历集合数据,使用迭代器模式有哪些优势?

概述 上篇文章,我们学习了状态模式。状态模式是状态机的一种实现方式。它通过将事件触发的状态转移和动作执行,拆分到不同的状态类中,以此来避免状态机类中的分支判断逻辑,应对状态机类代码的复杂性。 本章,学习另外…

Day20_学点儿JavaEE_基于Session的登录、数据库null值正确显示

1 登录 使用Session技术完成用户登录的功能: 登录功能会使用到Session,把用户登录的用户名和密码保存到Session,因为Session是属于每个用户独有的,就可以记录每个用户单独的登录信息。 当然,这仅仅是完成了一个简单的…