草庐IT

回归与分类

小熊331 2023-03-28 原文

回归与分类

机器学习的主要任务便是聚焦于两个问题:回归与分类

回归与分类

回归的定义

  • 机器学习的过程就是寻找函数的过程,通过训练获得一个函数映射,给定函数的输入,函数会给出相应的一个输出,若输出结果是一个数值scalar时,即称这一类机器学习问题为回归问题
  • 就如李宏毅老师所说:Regression就是找到一个函数function,通过输入特征x,输出一个数值scalar
  • 例如:房价数据,根据位置、周边、配套等等这些维度,给出一个房价的预测

分类与回归的区别

  • 分类是基于数据集,作出分类选择
  • 分类与回归区别在一输出变量的类型
  • 输出是离散的就可以做分类问题,即通常多个输出,输出i是预测为第i类的置信度
  • 输出是连续的就可以做回归问题 ,即单连续值输出,跟真实值区别作为损失

模型步骤

  • step1:模型假设,选择模型框架(线性模型)
  • step2:模型评估,如何判断众多模型的好坏(损失函数)
  • step3:模型优化,如何筛选最优的模型(梯度下降)

一、线性模型

step1 模型假设

  • 给定n维输入 x = [x1,x2,....,xn]^T
  • 线性模型有一个n维权重和一个标量偏差 即w与b
  • 输出是输入的加权和 y = w1x1 + w2x2 + ... +wnxn +b
  • 向量版本 y = <w,x> + b

假设1:影响房价的关键因素是卧室个数,卫生间个数,和居住面积,记为x1,x2,x3

假设2:成交价是关键因素的加权和 则 y = w1x1 + w2x2 +w3x3 + b,

权重和偏置的实际值在后面决定

step2 模型评估(衡量预估质量)

  • 收集和训练数据
  • 如何判断众多模型的好坏(根据损失函数判断)

1.平方损失 y为真实值,y1为估计值(预测值)
$$
p(y,y1) = 1/2(y-y1)^2
$$
2.训练损失
$$
p(X,y,w,b) = ∑(y[i] - (b + <w,x[i]>))^2
$$

step3 选取最优模型(梯度下降)

  • 为了获得最优模型故要使L(w,b)损失函数值最小化,而对于L(w,b)实质上就是w,b的函数,因此可以通过求偏微分来寻找其最小化损失点

最小化损失学习参数
$$
w* , b* = arg min(X,y,w,b)
$$

  • 而对于梯度下降来讲

  • 1.首先要挑选一个初始值 w0,同时引入学习率(步长的超参数) η

  • 2.重复迭代参数 t =1,2,3

  • 3.沿梯度方向将增加损失函数值
    $$
    w[t] = w[t-1] -η*(∂L/∂w[t-1])
    $$

注:上式中减号意思为沿着梯度反方向

import numpy as np
import matplotlib.pyplot as plt

def my_func(x): #定义原函数
    return x**4 + 2*x**3 - 3*x**2 -2*x
def grad_func(x): #定义导数
    return 4*x**3 + 6*x**2 -6*x -2

eta = 0.09 #学习系数
x = -1.5 #定义自变量x起始值
record_x = [] #记录x值
record_y = [] #记录y值

for i in range(20): #将x循环20次
    y = my_func(x)
    record_x.append(x) #将记录添加
    record_y.append(y)
    x -= eta*grad_func(x) #梯度下降法公式 学习系数*导数值

x_f = np.linspace(-2.8,1.6)
y_f = my_func(x_f)

plt.plot(x_f,y_f)
plt.scatter(record_x,record_y)
plt.xlabel("x", size=14)
plt.ylabel("y", size=14)
plt.grid()
plt.show()

二、广义线性模型(generalized linear model)

$$
y=g^-1 (w^Tx+b)
$$

上面式子即为广义线性模型的一种表达,其中g(.)被称为联系函数,同时要求单调可微。使用广义线性模型可以实现强大的非线性函数映射功能(比如对数线性回归,令g(.) = ln(.),此时模型预测值对应的是真实值标记在指数尺度上的变化)

那么线性模型的输出是一个实值,而分类任务的标记是离散值,怎么把二者联系起来呢?

  • 广义线性模型已经给了我们答案,我们要做的是找到一个单调可微的联系函数,把二者联系起来
  • 对于一个二分类任务,比较理想的函数是阶跃函数(激活函数)
对数线性回归(log-linear regression)

由于单位阶跃函数不连续,所以不能直接用作联系函数。故思路转换为如何在一定程度上近似单位阶跃函数呢? 对数几率函数正是我们所需常用的替代函数:sigmoid函数

  • 对于分类任务,由于是离散的数据,可以通过广义线性模型的非线性函数映射进行,简单来说将其离散数据映射在相似函数之上,也就是激活函数

总结

那么对于一整个回归过程来说 首要要假设模型去进行预选,接着要进行模型的评估计算损失函数,最后一步则是对损失函数进行优化即梯度下降算法

将一整个回归过程放在神经网络中时 在正向传播中,首先进行将数据值x进行输入,其次通过权值和的计算以及激活函数得到输出值,传输至第二层,层层往下,最后输出值 根据输出值与真实值之间的distance即为loss函数

有关回归与分类的更多相关文章

  1. ruby-on-rails - 带有分类器 gem 的无效编码符号 - 2

    当我将项目添加到我的Postgres数据库时,一切似乎都运行良好。在不做任何更改的情况下,只要在我的应用程序中的任何位置启动Madeleine,我的Rails应用程序就会开始失败:EncodingErrorinEventsController#updateinvalidencodingsymbolapp/controllers/events_controller.rb:137:in`update'137是问题行:135defupdate136@event=Event.find(params[:id])137m=SnapshotMadeleine.new("bayes_data")...

  2. ruby - 逻辑回归给出不正确的结果 - 2

    我在一个网站上工作,收集人们玩过的国际象棋比赛的结果。查看玩家的评分以及他们与对手的评分之间的差异,我绘制了一个图表,其中的点代表获胜(绿色)、平局(蓝色)和失败(红色)。根据这些信息,我还实现了逻辑回归算法来对获胜和获胜/平局的截止值进行分类。使用评级和差异作为我的两个特征,我得到了一个分类器,然后在图表上绘制了分类器改变其预测的边界。我的梯度下降、成本函数和sigmoid函数的代码如下。defgradient_descent()oldJ=0newJ=J()alpha=1.0#Learningraterun=0while(run0.001))thenrun-=20end#Do20mo

  3. ruby - 贝叶斯分类器分数代表什么? - 2

    我正在使用rubyclassifiergem其分类方法返回根据训练模型分类的给定字符串的分数。分数是百分比吗?如果有,最大差值是100分吗? 最佳答案 这是概率的对数。对于大型训练集,实际概率是非常小的数字,因此对数更容易比较。从理论上讲,分数的范围从接近零的无穷小到负无穷大。10**score*100.0会给出实际概率,确实最大相差100。 关于ruby-贝叶斯分类器分数代表什么?,我们在StackOverflow上找到一个类似的问题: https://st

  4. Ruby 曲线拟合(对数回归)包 - 2

    我正在寻找进行对数回归(对数方程的曲线拟合)的Rubygem或库。我试过statsample(http://ruby-statsample.rubyforge.org/),但它似乎没有我要找的东西。有人有什么建议吗? 最佳答案 尝试使用“statsample”gem。您可以使用类似的方法执行指数、对数、幂、正弦或任何其他变换。我希望这有帮助。require'statsample'#IndependentVariablex_data=[Math.exp(1),Math.exp(2),Math.exp(3),Math.exp(4),Ma

  5. ruby - 在 Ruby 中实现贝叶斯分类器? - 2

    我想实现一个简单的贝叶斯分类系统来对短信进行基本的情感分析。欢迎提供在Ruby中实现的实用建议。也欢迎提出除贝叶斯之外的其他方法的建议。 最佳答案 IlyaGrigorik在BayesianClassifiers上的这篇博文中对这个问题给出了很好的答案。此外,您不妨看看ai4rrubygem用于贝叶斯分类器的一些替代方法。ID3是一个不错的选择,因为它提供了即使对机器学习技术没有任何真正了解的人也能“理解”的决策树。 关于ruby-在Ruby中实现贝叶斯分类器?,我们在StackOver

  6. javascript - 多种分类的 Backbone.js 集合 - 2

    我有一个包含名称和日期的待办事项列表。我希望能够使用标题或日期对列表进行排序。我该怎么做?比较器只允许一种类型的排序。谢谢。 最佳答案 可以在比较器中实现更多逻辑,以便您可以抽象出一些排序逻辑:varCollection=Backbone.Collection.extend({model:myModel,order:'name'comparator:function(model){if(this.order==='name'){returnmodel.get('name');}else{returnmodel.get('date')

  7. javascript - 使用分类 ("active"鼠标悬停时 D3 颜色变化,真) - 2

    我是js和D3的新手。我已经生成了各种热图,并想使用D3的on.mouseover更改图block的颜色。我可以显式更改颜色,但想使用CSS事件规则。可能很容易修复。任何帮助将不胜感激。完整代码如下。谢谢。MJ-HeatmapCountryByDistrict_Port_NmeHeatmapbody{font:10pxsans-serif;}.label{font-weight:bold;}.tile{shape-rendering:crispEdges;}.axispath,.axisline{fill:none;stroke:#000;shape-rendering:crispEd

  8. B44 - 基于stm32蓝牙智能语音识别分类播报垃圾桶 - 2

    文章目录任务效果原理图指令编码语音识别模块简介代码设计驱动舵机模块简介驱动主程序源代码任务题目:基于stm32蓝牙智能语音识别分类播报垃圾桶实现功能如下:语音识别根据使用者发出的指令自动对垃圾进行分类根据垃圾的种类实时播报垃圾的类型根据垃圾种类驱动对应的舵机进行转动(模拟垃圾桶打开,并在十秒钟自动复位,模拟垃圾桶关闭)OLED显示屏实时显示四种垃圾桶的状态蓝牙app可以控制垃圾桶开关,同时显示四种垃圾桶状态效果原理图指令编码语音识别模块简介LU-ASR01是一款低成本、低功耗、体积小、高性能的离线语音识别系统。本系统集成了语音识别、语音回复、IO控制(多信号输出)、串口输出、温湿度广播等功能。

  9. javascript - 如何使用 d3.js 创建趋势/指数回归线? - 2

    我正在尝试创建一条曲线来显示图表中的数据趋势,但我不知道如何生成必要的数据点,类似于此图中的第二个图表:我找到的所有文档和示例都使用了我头脑中的数学,任何伪代码都很棒。 最佳答案 我能够使用以下代码绘制指数回归线:functionsquare(x){returnMath.pow(x,2);};functionarray_sum(arr){vartotal=0;arr.forEach(function(d){total+=d;});returntotal;}functionexp_regression(Y){varn=Y.length

  10. javascript - D3.js 线性回归 - 2

    我搜索了有关构建线性回归的一些帮助,并在此处找到了一些示例:nonlinearregressionfunction还有一些应该涵盖这个的js库,但不幸的是我无法让它们正常工作:simple-statistics.js还有这个:regression.js使用regression.js我能够得到该行的m和b值,所以我可以使用y=m*x+b绘制我的图形线性回归后的线,但无法将这些值应用于线生成器,我尝试的代码如下:d3.csv("typeStatsTom.csv",function(error,dataset){//HereIplototherstuff,setupthex&yscaleco

随机推荐