机器学习实战教程(一):线性回归基础篇(中)

局部加权线性回归



  线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有小均方误差的无偏估 计。显而易见,如果模型欠拟合将不能取得好的预测效果。所以有些方法允许在估计中引入一 些偏差,从而降低预测的均方误差。

  其中的一个方法是局部加权线性回归(Locally Weighted Linear Regression,LWLR)。在该方法中,我们给待预测点附近的每个点赋予一定的权重。与kNN一样,这种算法每次预测均需要事先选取出对应的数据子集。该算法解除回归系数W的形式如下:

  其中W是一个矩阵,这个公式跟我们上面推导的公式的区别就在于W,它用来给每个店赋予权重。

  LWLR使用"核"(与支持向量机中的核类似)来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:

  这样就构建了一支只含对角元素的权重矩阵w,并且点x与x(i)越近, w(i, i)将会越大,k是我们唯一需要赋值的参数,他决定可权重的大小

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
def loadDataSet(fileName):
    """
    功能:导入数据
    输入:file
    输出:X, y
    """
    data = np.loadtxt(fileName)
    X = data[:,0:-1]
    y = data[:,-1]
    return X, y

def plotDataSet(fileName):
    """
    功能 画出原始的图像
    """
    xArr ,yArr = loadDataSet(fileName)

    m = len(xArr)
    xcode = []; ycode = []

    for i in range(m):
        xcode.append(xArr[i][1])
        ycode.append(yArr[i])

    yHat_1 = lwlrTest(xArr, xArr, yArr, 1.0)                            #根据局部加权线性回归计算yHat
    yHat_2 = lwlrTest(xArr, xArr, yArr, 0.01)                            #根据局部加权线性回归计算yHat
    yHat_3 = lwlrTest(xArr, xArr, yArr, 0.003)                            #根据局部加权线性回归计算yHat
    xMat = np.mat(xArr)                                                    #创建xMat矩阵
    yMat = np.mat(yArr)                                                    #创建yMat矩阵
    srtInd = xMat[:, 1].argsort(0)                                        #排序,返回索引值
    xSort = xMat[srtInd][:,0,:]
    fig, axs = plt.subplots(nrows=3, ncols=1,sharex=False, sharey=False, figsize=(10,8))
    axs[0].plot(xSort[:, 1], yHat_1[srtInd], c = ‘red‘)                        #绘制回归曲线
    axs[1].plot(xSort[:, 1], yHat_2[srtInd], c = ‘red‘)                        #绘制回归曲线
    axs[2].plot(xSort[:, 1], yHat_3[srtInd], c = ‘red‘)                        #绘制回归曲线
    axs[0].scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = ‘blue‘, alpha = .5)                #绘制样本点
    axs[1].scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = ‘blue‘, alpha = .5)                #绘制样本点
    axs[2].scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = ‘blue‘, alpha = .5)                #绘制样本点
    #设置标题,x轴label,y轴label
    axs0_title_text = axs[0].set_title(u‘局部加权回归曲线,k=1.0‘,FontProperties=font)
    axs1_title_text = axs[1].set_title(u‘局部加权回归曲线,k=0.01‘,FontProperties=font)
    axs2_title_text = axs[2].set_title(u‘局部加权回归曲线,k=0.003‘,FontProperties=font)
    plt.setp(axs0_title_text, size=8, weight=‘bold‘, color=‘red‘)
    plt.setp(axs1_title_text, size=8, weight=‘bold‘, color=‘red‘)
    plt.setp(axs2_title_text, size=8, weight=‘bold‘, color=‘red‘)
    plt.xlabel(‘X‘)
    plt.show()
def lwlr(testPoint, xArr, yArr, k = 1.0):
    """
    函数说明:使用局部加权线性回归计算回归系数w
    Parameters:
        testPoint - 测试样本点
        xArr - x数据集
        yArr - y数据集
        k - 高斯核的k,自定义参数
    Returns:
        ws - 回归系数
    """
    xMat = np.mat(xArr); yMat = np.mat(yArr).T
    m = np.shape(xMat)[0]

    weights = np.mat(np.eye(m))
    for j in range(m):
        diffMat = testPoint - xMat[j, :]
        weights[j, j] = np.exp(diffMat * diffMat.T / (-2.0 * k ** 2))
    xTx = xMat.T * (weights * xMat)
    if np.linalg.det(xTx) == 0.0:
        print("矩阵为奇异矩阵,不能求逆")
        return
    ws = xTx.I * (xMat.T * (weights * yMat))                            #计算回归系数
    return testPoint * ws

def lwlrTest(testArr, xArr, yArr, k=1.0):
    """
    函数说明:局部加权线性回归测试
    Parameters:
        testArr - 测试数据集
        xArr - x数据集
        yArr - y数据集
        k - 高斯核的k,自定义参数
    Returns:
        ws - 回归系数
    """
    m = np.shape(testArr)[0]                                            #计算测试数据集大小

    yHat = np.zeros(m)
    for i in range(m):                                                    #对每个样本点进行预测
        yHat[i] = lwlr(testArr[i],xArr,yArr,k)
    return yHat

if __name__ == "__main__":
    plotDataSet("data.txt")
   



原文地址:https://www.cnblogs.com/NaLaEur/p/9160719.html

时间: 2024-10-03 22:38:42

机器学习实战教程(一):线性回归基础篇(中)的相关文章

机器学习实战教程(五):朴素贝叶斯实战篇之新浪新闻分类

原文链接: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_5_bayes_2.html 一.前言 上篇文章机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器讲解了朴素贝叶斯的基础知识.本篇文章将在此基础上进行扩展,你将看到以下内容: 拉普拉斯平滑 垃圾邮件过滤(Python3) 新浪新闻分类(sklearn) 二.朴素贝叶斯改进之拉普拉斯平滑 上篇文章提到过,算法存在一定的问题,需要进行改进.那么需要改进的地方在哪里呢?利用贝叶斯分类器对文档进行

Arduino 高级教程 01:基础篇

我与 Arduino,以及为什么要写这个系列的文章 Arduino 这个已经火了好多年了,早就不是什么新鲜的技术.如果有人还不清楚 Arduino 是个什么东西,对不起,请自行搜索,随便翻开哪个维基百科的介绍或者爱好者写的系列文章,人家介绍得都比我更清楚更全面.恕我不在这里赘述了. 最早接触 Arduino 是在 2008年,那时候我对嵌入式开发一窍不通,刚刚开始学习单片机,就是在那时候注意到了 Arduino,它确实能够让我快速地在 8 位 AVR 单片机上跑点简单的小程序,颇有点小小的成就感

机器学习实战教程(一):线性回归基础篇(上)

一 什么是回归? 回归的目的是预测数值型的目标值,最直接的办法是依据输入,写入一个目标值的计算公式. 假如你想预测小姐姐男友汽车的功率,可能会这么计算: HorsePower = 0.0015 * annualSalary - 0.99 * hoursListeningToPublicRadio 这就是所谓的回归方程(regression equation),其中的0.0015和-0.99称为回归系数(regression weights),求这些回归系数的过程就是回归.一旦有了这些回归系数,再

机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器

原文链接: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_4_bayes_1.html 一.前言 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失.是否值得投资.信用等级评定等多分类问题.该算法的优点在于简单易懂.学习效率高.在某些领域的分类问题中能够与决策树.神经网络相媲美.但由于该算法以自变量之间的独立(条件特征独立)性和连续变量的正态性假设为前提,就会导致算法精度在某种程度上受影响. 本篇文章将从朴素贝叶斯推断原理开始讲起,

【机器学习实战】多元线性回归模型

在许多实际问题中,影响因变量Y的自变量不止一个,通常设为p个,此时无法借助于图形的帮助来确定模型,这里则使用一种最为简单且普遍的模型--多元线性模型来进行回归计算. 1.数学模型 当影响Y值的因素不唯一时,我们可以使用多元线性回归模型: 当未知参数有两个时,我们可以画出此方程的图形表示(此时是一个平面,如图).如果未知数大于2时,则很难把此超平面给画出来. 如上图,为了求得等参数的值,我们由各个样本点(图中为红点)做一条平行于Y轴的直线,此直线交平面方程于一点,然后我们求得此线段的程度,并进行平

java教程之语法基础(中)

运算符号: 1).算术运算符. + - * / %   %:任何整数的余数不是0就是1,所以只要改变被余数就可以实现开关运算. +:连接符. ++,-- 2).赋值运算符. =  += -= *= /= %= 3).比较运算符. 特点:该运算符的特点是:运算之后的结果,要么是true,要么是false. 4).逻辑运算符. &  |  ^  !   &&   || 逻辑运算符除了 !  外都是用于连接两个boolean类型表达式. &: 只有两边都为true结果是true.

Swift学习笔记-教程学习一基础篇

1.1 常量和变量(Constants and Variables) 常量和变量把一个名字和一个指定类型的值关联起来.常量(不需要改变的值)值一旦设定就不能改变,而变量的值可以随意更改.如果可能,尽量使用常量. 声明Declaring Constants and Variables 常量和变量必须在使用前声明,用 let 来声明常量,用 var 来声明变量. let maximumNumberOfLoginAttempts = 10 var currentLoginAttempt = 0 你可以

iOS开发范例实战宝典(基础篇)——互动出版网

这篇是计算机类的优质推荐>>>><iOS开发范例实战宝典(基础篇)> 以最新的IOS 8为版本编写,内容覆盖了IOS开发的方方面面,通过大量实例提升实战技能,并对书中的重点和难点进行了专门分析. 编辑推荐 *以最新的iOS 8为版本编写,内容覆盖了iOS开发的方方面面* *通过200多个实例提升实战技能,并对书中的重点和难点进行了专门分析 *注重实战:详细讲解了117个iOS开发经典实例,提高实战开发水平 *内容全面:全面介绍了iOS开发中最为常见的14类界面模块 *由

《机器学习实战》之二分K-均值聚类算法的python实现

<机器学习实战>之二分K-均值聚类算法的python实现 上面博文介绍了K-均值聚类算法及其用python实现,上篇博文中的两张截图,我们可以看到,由于K-均值聚类算法中由于初始质心的选取,会造成聚类的局部最优,并不是全局最优,因此,会造成聚类的效果并不理想,为克服K-均值算法收敛于局部最小值的问题,就有了二分K-均值算法. 二分K-均值聚类算法 二分K均值算法是基本K均值算法的直接扩充,其基本思想是:为了得到K个簇,首先将所有点的集合分裂成两个簇,然后从这些簇中选取一个继续分裂,迭代直到产生