cc1989summer 发表于 2024-8-27 20:16

《人工智能实践教程——从Python入门到机器学习》阅读分享四:回归算法

<div class='showpostmsg'> 本帖最后由 cc1989summer 于 2024-8-27 21:32 编辑

<p><span style="font-size:18px;">今天的学习分享,我们来学习第二部分机器学习的最后一个章节《回归算法》</span></p>

<p>&nbsp;</p>

<p><span style="font-size:18px;"> &nbsp;</span></p>

<p>&nbsp;</p>

<p><span style="font-size:18px;">回归算法应该说是我们比较熟悉的一个名词,在大学微积分、线性代数里应该都有涉及。</span></p>

<p>&nbsp;</p>

<p><span style="font-size:18px;">下面是网络上对回归算法的定义:</span></p>

<p><span style="font-size:18px;">回归问题是<strong>预测一个连续值的输出</strong>(因变量)基于一个或多个输入(自变量或特征)的机器学习任务。 回归模型尝试找到自变量和因变量之间的内在关系。 </span></p>

<p>&nbsp;</p>

<p><span style="font-size:18px;">例子: 假设您有一个包含房价和房子特性(如面积、房间数量等)的数据集。 回归模型可以帮助您根据房子的特性来预测其价格。</span></p>

<p><span style="font-size:18px;">以下是一些常见的回归算法:</span></p>

<ul>
        <li data-priority=""><span style="font-size:18px;">线性回归</span></li>
        <li data-priority=""><span style="font-size:18px;">Robust 回归</span></li>
        <li data-priority=""><span style="font-size:18px;">Ridge 回归</span></li>
        <li data-priority=""><span style="font-size:18px;">LASSO 回归</span></li>
        <li data-priority=""><span style="font-size:18px;">Elastic Net</span></li>
        <li data-priority=""><span style="font-size:18px;">多项式回归</span></li>
        <li data-priority=""><span style="font-size:18px;">多层感知机</span></li>
        <li data-priority=""><span style="font-size:18px;">随机森林回归</span></li>
        <li data-priority=""><span style="font-size:18px;">支持向量机</span></li>
</ul>

<p>&nbsp;</p>

<p><span style="font-size:18px;">其实说来我们最熟悉的应该就是线性回顾,也就是一元线性方程:y=ax+b。</span></p>

<p><span style="font-size:18px;">在这里,Y是我们试图预测的因变量,X是我们用来进行预测的自变量,a是回归线的斜率,b是一个常数,称为截距。</span></p>

<p>&nbsp;</p>

<div style="text-align: left;"><span style="font-size:18px;"></span></div>

<p>&nbsp;</p>

<p>&nbsp;</p>

<div style="text-align: left;"><span style="font-size:18px;"></span></div>

<p>&nbsp;</p>

<p><span style="font-size:18px;">我们可以以身高(x)与体重(y)为例,二者是线性关系,身高正比于体重:</span></p>

<p><span style="font-size:18px;">线性回归的目标就是让f(X)与y之间的差距最小,也就是权重a和偏置b取什么值的时候f(X)和y最接近。</span></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<div style="text-align: left;"><span style="font-size:18px;"></span></div>

<p>&nbsp;</p>

<p><span style="font-size:18px;"><span style="color:#e74c3c;"><strong>损失函数</strong></span>是来度量模型预测值与真实值不一样的程度的,或者说度量预测错误的程度,损失函数值越小,模型就越好。</span></p>

<p><span style="font-size:18px;">在回归问题中,误差平方和是回归任务中最常用的性能度量。这里就可以令损失函数L(a,b)等于误差平方和。</span></p>

<p><span style="font-size:18px;">则损失函数为:</span></p>

<p>&nbsp;</p>

<div style="text-align: left;"><span style="font-size:18px;"></span></div>

<p>&nbsp;</p>

<p><span style="font-size:18px;">因此,将九个点分别带入该二元方程得到如下:</span></p>

<p><span style="font-size:18px;">58=160a+b</span></p>

<p><span style="font-size:18px;">63=165a+b</span></p>

<p><span style="font-size:18px;">...</span></p>

<p><span style="font-size:18px;">59=162a+b</span></p>

<p><span style="font-size:18px;">62=171a+b</span></p>

<p><span style="font-size:18px;">损失函数(总误差)为:</span></p>

<p>&nbsp;</p>

<div style="text-align: left;"><span style="font-size:18px;"></span></div>

<p><span style="font-size:18px;">如何得到最佳的a和b,使得尽可能多的到(x,y)数据点落在或者更靠近这条拟合出来的直线上,<strong>最小二乘法</strong>就是一个较好的计算方法。</span></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:18px;">那么什么是最小二乘法呢?</span></p>

<p><span style="font-size:18px;">通过最小化误差的平方和寻找数据的最佳函数匹配。最小二乘法在回归模型上的应用,就是要使得观测点和估计点的距离的平方和达到最小。&ldquo;最小&rdquo;指的是参数的估计值要保证各个观测点与估计点的距离的平方和达到最小,也就是刚才所说的使得尽可能多的(x,y)数据点落在或者更靠近这条拟合出来的直线上。</span></p>

<p><span style="font-size:18px;">因此要求损失函数(误差平方和)值最小,可通过对L(a,b)求偏导数获得,并使得一阶倒数的值为0:</span></p>

<p>&nbsp;</p>

<div style="text-align: left;"><span style="font-size:18px;"> &nbsp;</span></div>

<p>&nbsp;</p>

<div style="text-align: left;"><span style="font-size:18px;"></span></div>

<p>&nbsp;</p>

<p><span style="font-size:18px;">将该公式代入到上述案例中,得到关于求解未知变量a、b的二元一次方程:</span></p>

<p>&nbsp;</p>

<div style="text-align: left;"><span style="font-size:18px;"></span></div>

<p>&nbsp;</p>

<p>&nbsp;</p>

<div style="text-align: left;"><span style="font-size:18px;"></span></div>

<p>&nbsp;</p>

<p><span style="font-size:18px;">在得到了身高与体重的线程方程式后,我们就可以通过身高对体重进行预测!</span></p>

<p>&nbsp;</p>

<p><span style="font-size:18px;">下面我们用Python跑以下上述例程。</span></p>

<p>&nbsp;</p>

<pre>
<code>import numpy as np
import matplotlib.pyplot as plt

# ---------------1. 准备数据----------
data = np.array([,,,,,,,,])

# 提取data中的两列数据,分别作为x,y
x = data[:, 0]
y = data[:, 1]

# 用plt画出散点图
#plt.scatter(x, y)
#plt.show()

# -----------2. 定义损失函数------------------
# 损失函数是系数的函数,另外还要传入数据的x,y
def compute_cost(w, b, points):
    total_cost = 0
    M = len(points)

    # 逐点计算平方损失误差,然后求平均数
    for i in range(M):
      x = points
      y = points
      total_cost += (y - w * x - b) ** 2

    return total_cost / M

# ------------3.定义算法拟合函数-----------------
# 先定义一个求均值的函数
def average(data):
    sum = 0
    num = len(data)
    for i in range(num):
      sum += data
    return sum / num

# 定义核心拟合函数
def fit(points):
    M = len(points)
    x_bar = average(points[:, 0])

    sum_yx = 0
    sum_x2 = 0
    sum_delta = 0

    for i in range(M):
      x = points
      y = points
      sum_yx += y * (x - x_bar)
      sum_x2 += x ** 2
    # 根据公式计算w
    w = sum_yx / (sum_x2 - M * (x_bar ** 2))

    for i in range(M):
      x = points
      y = points
      sum_delta += (y - w * x)
    b = sum_delta / M

    return w, b

# ------------4. 测试------------------
w, b = fit(data)

print("w is: ", w)
print("b is: ", b)

cost = compute_cost(w, b, data)

print("cost is: ", cost)

# ---------5. 画出拟合曲线------------
plt.scatter(x, y)
# 针对每一个x,计算出预测的y值
pred_y = w * x + b

plt.plot(x, pred_y, c='r')
plt.show()
</code></pre>

<p><span style="font-size:18px;">运行结果跟上述计算结果一致:</span></p>

<p>&nbsp;</p>

<p><span style="font-size:18px;"> &nbsp;</span></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:18px;"> &nbsp;</span></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:18px;">其实简单的线性回归用EXCEL也可以办到。(趋势线&mdash;&mdash;线性&mdash;&mdash;显示公式)</span></p>

<p><span style="font-size:18px;">如下图,算得y = 0.4212x - 8.2883</span></p>

<p><span style="font-size:18px;">跟我们用python拟合的结果一致。</span></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:18px;"> &nbsp;</span></p>

<p>&nbsp;</p>

<p><span style="font-size:18px;">今天的分享就到这里,谢谢!</span></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

freebsder 发表于 2024-8-29 14:29

<p>最小二乘是个伟大的发明,好多地方都可以看到这玩意的变种。</p>

cc1989summer 发表于 2024-8-30 13:26

freebsder 发表于 2024-8-29 14:29
最小二乘是个伟大的发明,好多地方都可以看到这玩意的变种。

<p>有道理&nbsp;</p>

<hr />
<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>

Saoffon 发表于 2024-9-3 15:26

<h4 data-spm-anchor-id="5176.28103460.0.i2.7de05d27X1sDxh">线性回归<br />
&nbsp;</h4>

<ul>
        <li>原理:通过拟合最小二乘法来寻找数据的最佳线性关系。</li>
        <li>损失函数:均方误差(MSE)。</li>
        <li data-spm-anchor-id="5176.28103460.0.i4.7de05d27X1sDxh">特点:简单易用,但假设数据是线性的。</li>
</ul>
页: [1]
查看完整版本: 《人工智能实践教程——从Python入门到机器学习》阅读分享四:回归算法