机器学习(二)之监督学习

前言: 

上一节大概讲解了几种学习方式,下面几张就具体来讲讲监督学习的几种算法。

以下示例中\beta\omega都是权重的意思!!!

注:本文如有错误之处,还请读者指出,欢迎评论区探讨!

1 线性模型(Linear Models)

1.1 普通最小二乘法(Ordinary Least Squares)

概念:

残差平和和最小

推导:

由于懒得打公式,我们直接引用别人的(图片来源)

(1)先给出一个线性方程组

(2)改写成矩阵形式

(3)转化为一般形式

一般这个解都无精确解,只有最佳近似解,即超定方程。

(4)求偏导求\displaystyle \beta(一般来说,这个不需要我们手动求,调包就可以了,嘿嘿,调包侠)

 (5)最小二乘公式

\xi =min\left \| x\beta -y \right \|_{2}^{2}

 因为是超定方程,有许多近似解,但是残差平方和最小的通常只有一个,我们就规定这个就是最优近似解。

示例:

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# diabetas_X有442条样本,10个属性
diabetas_X, diabetas_Y = datasets.load_diabetes(return_X_y=True)
# 重新选取数据集,选取全部样本和前两个属性,并增加一维
diabetas_X = diabetas_X[:, np.newaxis, 2]
# 创建训练集和测试集
diabetas_X_train = diabetas_X[:-20]
diabetas_X_test = diabetas_X[-20:]
# 创建训练标签和真实的测试标签
diabetas_Y_train = diabetas_Y[:-20]
diabetas_Y_test = diabetas_Y[-20:]
# 使用线性回归的方法进行预测
regr = linear_model.LinearRegression()
# 拟合数据
regr.fit(diabetas_X_train, diabetas_Y_train)
# 预测测试集
diabetas_Y_pred = regr.predict(diabetas_X_test)
print("Coefficients:\n", regr.coef_)  # 回归系数
print("Mean square error:%.2f" % mean_squared_error(diabetas_Y_test, diabetas_Y_pred))  # 平均平方误差
print("Coefficient of determination : %.2f" % r2_score(diabetas_Y_test, diabetas_Y_pred))  # 决定系数

plt.scatter(diabetas_X_test, diabetas_Y_test, color="black")  # 点
plt.plot(diabetas_X_test, diabetas_Y_pred, color="red", linewidth=3)  # 线
# 不显示x和y轴
plt.xticks(())
plt.yticks(())
plt.show()

 结果:

Coefficients:
 [938.23786125]
Mean square error:2548.07
Coefficient of determination : 0.47

拓展:

(1)非负最小二乘法(Non-Negative Least Squares):可将所有的系数约束为非负数,在现实中应用很多,如商品价格

(2)普通最小二乘复杂度(Ordinary Least Squares Complexity):

1.2 岭回归和岭分类(Ridge regression and classification)

该方法是普通最小二乘的一个变体。

岭分类的本质是将分类问题转化为回归问题,然后调用岭回归去解决。在此我们只讨论岭回归。

引入:

在使用线性模型拟合回归函数时,最终目的是想要求出\omega的值,即最优近似解,更加直观的看到每个参数的权重大小,即重要性大小(权重大的,更重要),之后能够根据权重进行预测。

但是,当x多重共线的时候(即参数之间能够相互表示)的时候,那y的值就很难根据不同的x设计不同 的权重了。

不好理解是不是,上图!(图源)

这张图很清楚,举得也是一个极端的例子,这两个x之前存在着精确的相关关系,即x_{1}=2x_{2},导致有多种\omega满足这个式子。一般来说,x不会有这么精确地相关性,但是也足够迷惑了。

 这个方法的目的是想把方差较小的参数投影到方差大的维度上,减少线性相关性,更好的拟合函数,进行预测。

概念:

在最小二乘的基础上加了一个惩罚项(L2-范式)。

这个\alpha为惩罚项的系数,认为控制,范围为\alpha \geqslant 0

推导:

这推导过程使用了大量的线性代数,有奇异值分解,PCA等。

先用语言来描述一下,这个过程。我们先求出这个线性模型的特征值和特征向量,然后进行奇异值分解(求出对角矩阵,这个对角矩阵就是我们的构成\alpha的重要部分)和特征值分解(主成分分析PCA),找出主成分方向的第一主成分,进行投影,再垂直于第一主成分的面上找方差最大的第二主成分,进行投影,一直重复,直到n维结束。然后预测值就会根据\alpha值和新的坐标来重新预测

语言描述模糊?不理解?下面来图解(图片引用,这个博主还有详细的公式注解讲的非常棒):

这样就实现了岭回归的功能。

示例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model

# 创建一个 Ridge 回归模型
reg = linear_model.Ridge(alpha=0.5)

# 训练数据
X_train = np.array([[0, 0], [0, 0], [1, 1]])
y_train = np.array([0, 0.1, 1])

# 拟合模型
reg.fit(X_train, y_train)

# 获取回归系数和截距
coef = reg.coef_
intercept = reg.intercept_

# 绘制数据点
plt.scatter(X_train[:, 0], y_train, color='blue', label='Data Points')

# 绘制模型拟合的直线
x_line = np.linspace(0, 1, 100)
y_line = coef[0] * x_line + coef[1] * x_line + intercept
plt.plot(x_line, y_line, color='red', linewidth=2, label='Regression Line')

# 添加标签和图例
plt.xlabel('Feature 1')
plt.ylabel('Target')
plt.title('Linear Regression with Ridge Regularization')
plt.legend()

# 显示图形
plt.show()

 这是岭回归的结果(鲁棒性较好),比下面普通最小二乘(有点过于拟合了)的效果要好。

Ridge回归:

 Oridinary回归:

拓展:

(1)当\alpha越大(越靠左),惩罚越大,权重越趋近于0,\alpha越小,后面的震动越大。

(2) 复杂度和普通最小二乘一样。

(3)留一交叉验证(leave-one-out Cross-Validation):从数据集D中,取出一组作为验证集,其他作为训练集,直到所有的样本都做过验证集,共计N次,最后对验证误差求平均。

 1.3 套索算法(Lasso

概念:

最小二乘解加L1-范式。

由于未知量比样本多,导致许多权重很小,就不是很重要。如果使用岭回归,这种不重要的变量也估计出来了,很容易导致过拟合。用Lasso方法,就可以把这些不重要变量的系数压缩为0,既实现了较为准确的参数估计,也实现了变量选择(降维)。

推导:

 左为Lasso,右为岭回归,β1,β2是要优化的模型参数,红色椭圆为目标函数,蓝色区域是解空间。

该图可以看出来,Lasso的最优解更容易切到坐标轴上,而Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数,使模型相对比较稳定,但和Lasso相比,鲁棒性比较差。

示例:

import matplotlib.pyplot as plt
from sklearn import linear_model
import numpy as np
reg=linear_model.Ridge(alpha=0.1)  #alpha惩罚系数
x_train=np.array([[0, 0], [1, 1]])
y_train=np.array([0,1])

x_test=np.array([[1,1]])

reg.fit(x_train,y_train)
y_pre=reg.predict(x_test)
coef=reg.coef_
intercept=reg.intercept_

plt.scatter(x_train[: ,0],y_train,color="blue",label="Train Points")
x_line=np.linspace(0,1,100)
y_line = coef[0] * x_line + coef[1] * x_line + intercept
plt.plot(x_line, y_line, color='red', linewidth=2, label='Regression Line')
plt.scatter(x_test[:,0],y_pre,color="green",label="Test Points")

plt.xlabel('Feature 1')
plt.ylabel('Target')
plt.title('Linear Regression with Ordinary Regularization')
plt.legend()
plt.show()

绿色为预测的点,蓝色是原始数据点。根据图片来看,肯定是Lasso拟合的效果更好,更接近与现实。

Lasso回归:

 Ridge回归:

 

 Oridinary回归:


还有很多种线性模型,我们有时间再讨论,下面先介绍线性和二次判别。

2 线性和二次判别分析(Linear and Quadratic Discriminant Analysis)

 该图显示了线性判别分析和二次判别分析的决策边界。下面一行表明,线性判别分析只能学习线性边界,而二次判别分析可以学习二次边界,因此更加灵活。

2.1 使用LDA(线性判别)进行降维(Dimensionality reduction using Linear Discriminant Analysis)

概念:

这个最熟悉的应该就是Fisher判别了吧,哈哈哈

给定训练样例集,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近、异类样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。

一句话概括就是类内离散度小,类间离散度大。

推导(引用):

示例:

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

iris=datasets.load_iris()
x=iris.data
y=iris.target
target_names=iris.target_names

pca=PCA(n_components=2)
x_r=pca.fit(x).transform(x)  #从这可以看出来pca是无监督学习

lda=LinearDiscriminantAnalysis(n_components=2)
x_r2=lda.fit(x,y).transform(x)

print(
    "explained variance ratio (first two components): %s"
    % str(pca.explained_variance_ratio_)
)


plt.figure()
colors=["navy",'turquoise','darkorange']
lw=2

for color ,i, target_name in zip(colors,[0,1,2],target_names):
    plt.scatter(x_r[y==i,0],x_r[y==i,1],color=color,alpha=0.8,lw=lw,label=target_name)

plt.legend(loc="best",shadow=False,scatterpoints=1)
plt.title("PCA of IRIS dataset")

plt.figure()
for color,i,target_name in zip(colors,[0,1,2],target_names):
    plt.scatter(x_r2[y == i, 0], x_r2[y == i, 1], color=color, alpha=0.8, lw=lw, label=target_name)

plt.legend(loc="best",shadow=False,scatterpoints=1)
plt.title("LDA of IRIS dataset")
plt.show()

对比LDA和PCA,LDA是监督学习,PCA是无监督学习。

LDA:

PCA:

 2.2 LDA和QDA分类的数学公式(Mathematical formulation of the LDA and QDA classifiers)

引入:

后验概率:

 多元高斯分布:

QDA:

就是将后验概率求对数,预测类是使对数后验值最大化的类。

注:如果输入的每个类是独立的,QDA就相当于朴素贝叶斯分类器。

LDA:

LDA是QDA的一种特殊情况,它假设每个类的高斯函数共享相同的协方差矩阵。

 这边的计算公式也特别复杂,大家可参考这个网站

 3.核岭回归(Kernel Ridge Regression)

是Ridge Regression的kernel版本。

概念:

它在由各自的核和数据诱导的空间中学习线性函数。对于非线性核,这对应于原始空间中的非线性函数。

RR和KRR的比较:

 加入Kernal可以处理非线性数据,即,将数据映射到某一个核空间,使得数据在这个核空间上线性可分。

推导:

这一部分没有看到详细的推导过程,我说一下我自己的理解。原来的RR权重计算公式是上面这个式子,下面那个是加了核的。。先不管推导过程,我们先从维度出发的角度看这个问题,RR原来是\chi \chi ^{T},是因为让X矩阵能够乘相乘,变成一个方阵和后面的想加再求逆,再与X相乘,还是获得和X一样的维度。我们是想让这个RR的线性加一点非线性,Gram矩阵K代替XX^T。(图源)

感觉这个式子有点怪怪的,KRR变换后的维度好像没法统一把。。。(希望有个大佬可以告诉我)

拓展:

 KRR和SVR(支持向量机)两人学习到的模型是一样的,但是损失函数不同,KRR使用了均方误差损失(squared error loss),SVR使用的\epsilon -insensitive损失。两人都用了L2正则化。

差异:

1.损失函数不同

2.KRR拟合可以封闭式进行,即可以直接进行求解,有精确解

3.因为RR非稀疏,KRR也继承他这衣钵,预测时间比SVR慢(\epsilon>0的时候就是稀疏啦)

具体时间可看:


  后面还有好多个算法要讲,防止篇幅太长,小伙伴看不下去,我们移步下一篇吧!

 欢迎点赞,收藏。本专栏目前会一直更新哒

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

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

相关文章

17. map和set的模拟实现(也就是用红黑树封装map和set)

1.map和set底层调用的红黑树的实现 有不清楚的地方&#xff0c;参考AVL树的模拟实现和红黑树的模拟实现 红黑树迭代器的实现 // 红黑树迭代器的类模板 template<class T, class Ref, class Ptr> struct __RBTreeIterator {// 将红黑树节点的类类型定义为Nodetypedef R…

绽放新笑容:儿童换牙期的关怀与注意

引言&#xff1a; 儿童的换牙期是成长过程中的重要阶段&#xff0c;标志着他们逐渐迈向成人世界。然而&#xff0c;伴随着牙齿的脱落和新牙的生长&#xff0c;孩子们可能会经历一些不适和困扰。本文将探讨儿童换牙期的注意事项&#xff0c;以帮助家长和孩子们度过这一特殊时期&…

扎根理论分析原理、方法与Nvivo技术应用

扎根理论越来越流行&#xff0c;成为经常被采用的研究方法之一。扎根理论的研究者来自广泛的研究领域&#xff0c;例如社会工作、护理、医药、综合医疗保健、教育、管理和商业。这些从业者和学者试图从他们所在学科范围内解释行为模式。对于扎根理论本质和实践的研究引发了知名…

这个表格为什么在VS Code里面预览可以显示,在浏览器预览就没有显示

在VS Code里面预览可以显示如图&#xff1a; 在浏览器预览就不能显示了&#xff0c;刚开始还好的后来不知道弄错了哪里了&#xff0c;哭死 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"vi…

Swagger:在线接口文档

Swagger介绍及使用 官网:https://swagger.io/ 介绍 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息&#xff0c;就可以做到生成接口文档&#xff0c;以及在线接口调试页面。 Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 使用方式 1.导入 kni…

qt5-入门-QListWidget-通过右键快捷菜单复制item内容

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 效果 在某个item上右键&#xff0c;点击copy后&#xff0c;item的内容已复制到剪贴板。 实现 #include <QMenu> #include <…

如何用微信发布考试成绩(如月考、期中、期末等)

自教育部《未成年人学校保护规定》颁布后,教育部明确表示:学校不得公开学生的考试成绩、排名等信息!同时学校应采取措施,便利家长知道学生的成绩等学业信息,对于教师来说,如何用微信发布考试成绩(如:月考、期中、期末等)就成了一道难题... 公开吧,会伤害到学生自尊心,甚至被投诉…

创建钉钉审批流实例

1、依赖 <!--钉钉 api --> <dependency><groupId>com.aliyun</groupId><artifactId>dingtalk</artifactId><version>2.0.14</version> </dependency> <!--钉钉 事件订阅--> <dependency><groupId>co…

CUDA编程技术概述

CUDA&#xff08;Compute Unified Device Architecture&#xff0c;统一计算设备架构&#xff09;是由英伟达&#xff08;NVIDIA&#xff09;公司推出的一种软硬件集成技术&#xff0c;是该公司对于GPGPU&#xff08;通用图形处理器计算&#xff09;的正式名称。透过这个技术&a…

Levenberg-Marquardt (LM) 算法进行非线性拟合

目录 1. LM算法2. 调包实现3. LM算法实现4. 源码地址 1. LM算法 LM算法是一种非线性最小二乘优化算法&#xff0c;用于求解非线性最小化问题。LM主要用于解决具有误差函数的非线性最小二乘问题&#xff0c;其中误差函数是参数的非线性函数&#xff0c;需要通过调整参数使误差函…

eNSP学习——静态路由及默认路由基本配置

目录 知识背景 实验目的 实验步骤 实验内容 实验拓扑 实验编址 实验前期准备 实验步骤 1、基本配置&#xff08;按照实验编址设置好对应的IP地址&#xff09; 2、是实现主机之间的通信 3、实现全网全通来增强网络的可靠性 4、使用默认路由实现简单的网络优化 需要各…

HTB靶场 Perfection

端口 打开了ssh和http服务 访问 Perfection靶机的网站 是一个根据权重计算总成绩的网站 Wappalyzer查看网页用的什么编写搭建的 抓包看一下是怎么工作的 发送,&#xff0c;返回的结果 如果我在 类别 后面多加一句命令 就会出现提示 恶意输入阻止 大概率有命令注入 通过插件…

解决宏定义后面无法加分号

总结&#xff1a;注意是针对单行if语句使用&#xff0c;并且宏定义后面必须带分号&#xff08;格式统一&#xff09; 参考连接 C语言种do_while(0)的妙用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1vk4y1R7VJ/?spm_id_from333.337.search-card.all.click&vd_…

2万8金句美句格言签名句子ACCESS\EXCEL数据库

优美句子类的数据已经有《33万多优美句子经典句子ACCESS数据库》、《近2万签名的句子网络签名ACCESS数据库》、《24万QQ伤感签名微信签名ACCESS数据库》、《2万多条QQ签名论坛签名大全ACCESS数据库》&#xff0c;今天又遇到一个&#xff0c;感觉也很不错&#xff0c;发上来看看…

pip安装的python包放在哪里了?—— ubuntu系统

1 pip 安装了哪些包 2 包安装在哪里了 thirty-twott:~/Desktop$ pip show openai Name: openai Version: 1.19.0 Summary: The official Python library for the openai API Home-page: Author: Author-email: OpenAI <supportopenai.com> License: Location: /ho…

Cairo

文章目录 关于 Cairo 关于 Cairo 官网&#xff1a;https://cairographics.org官方文档&#xff1a;https://cairographics.org/documentation/ Cairo是一个支持多个输出设备的2D图形库。 当前支持的输出目标 包括 X Window System&#xff08;通过Xlib 和 XCB&#xff09;、Qu…

Gartner发布攻击面管理创新洞察:CTEM、VA、EASM、CAASM、ASA、DRPS、BAS、VM等攻击面管理相关技术及关系

安全运营团队负责管理跨内部和外部数字资产的复杂攻击面。这项研究概述了攻击面评估空间&#xff0c;以帮助安全和风险管理领导者驾驭技术并改善其安全状况。 主要发现 随着本地和云中的技术环境变得越来越复杂和分散&#xff0c;组织必须管理不断增长的攻击面。 SaaS 应用程序…

wordpress 突然报错Error establishing a database connection

wordpress 突然报错Error establishing a database connection 通过在宝塔端多种方式检测测&#xff0c;查看到时Mysql服务挂了&#xff0c;重启Mysql即可

cad中快速计算多个矩形面积的方法

1、输入命令reg&#xff0c;选中矩形创建面域 2、输入命令uni,选中刚刚创建的面域&#xff0c;组合成一个面域 3、输入命令&#xff1a;LI &#xff0c;选中面域&#xff0c;即可查看面积和周长 需注意的一点&#xff0c;开始创建的矩形或者多段线要在一个面内&#xff0c;就是…

OpenCV——Bernsen局部阈值二值化方法

目录 一、Bernsen算法1、算法概述2、参考文献二、代码实现三、结果展示Bernsen局部阈值二值化方法由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、Bernsen算法 1、算法概述 Bernsen 算法是另一种流行的局部阈值二值化方…
最新文章