核回归(Kernel Regression)

文章通过一个班主任安排座位的例子,引入了利用周围同学成绩预测新同学成绩的回归模型。采用高斯核函数描述距离对影响的大小,通过计算每个样本点的权重并进行加权平均来预测新同学的成绩。代码部分展示了如何实现这一模型,包括高斯核函数的定义、权重计算和预测值的生成。
摘要由CSDN通过智能技术生成

目录

引言

一、回归模型

1.1核函数

 1.2预测

二、代码部分

1、代码讲解

2、代码全文


引言

你是一个班主任,你的班级新来了一位同学,你为他安排了座位;

座位周围的同学成绩有好有坏,你希望可以预测下次月考时新同学的成绩;

传闻近朱者赤近墨者黑,如果和好学生做的近成绩会更好一些,和成绩差的学生坐一起成绩可能会低一些,于是你期望通过新同学周围同学的成绩来估算新同学的成绩。

这可能不是一个很恰当的例子,但我们需要关注其中的思想:我们认为一个样本点会受到其周边的样本点的影响;

一、回归模型

那么,我们该如何定义这种‘影响’(influence)的大小呢?

比较直白的方法,我们通过距离(distance)来定义;和同学做的近一些,那么对他的影响就大一些,如果远一点,那么影响就小一些。

1.1核函数

这里,我们引入核函数(Kernel functions)来描述距离的影响:

K(x)=\frac{1}{h\sqrt{2\pi }}e^{-\frac{1}{2} (\frac{x-x_{i}}{h}) ^{2}}

这里我们用的是高斯核(Gaussian kernel)

这里的xi我们可以认为是我们‘远离’或‘靠近’的参考目标;

我们给定xi以后(这里设置为0)画出核函数的图像,发现他像极了正态分布

这验证了我们‘近朱者赤’的思想,随着我们的x远离我们的xi,它的‘影响’也在不断的减小

 1.2预测

接下来我们假设有多位同学

探究处在x=2号位的同学,我们画一条x=2的直线,注意他与曲线的交点

这几位同学对该同学的影响力就为直线与曲线交点的核函数值

当我们有核函数值了后,就可以开始预测了

其中xi点的权重为wi,ki为为该点的核函数值

w_{i}=\frac{k_{i}}{\sum_{1}^{n}k_{i}}

显然wi是经过归一化处理的,所有的wi的和都为1

\widehat{y}=\sum_{1}^{n}y_{i}w_{i}

将我们的样本点和权重求积在求和即得到我们的预测点的值

以图为例,我们探讨x=2处的预测值,假设id为i的点核函数在x=2处的值为k_{i},,图中核函数值就为k_{1},k_{2},k_{3},k_{4},k_{5},样本y_{1},y_{2},y_{3},y_{4},y_{5}的值为,则预测值\widehat{y}=\frac{k_{1}y_{1}+k_{2}y_{2}+k_{3}y_{3}+k_{4}y_{4}+k_{5}y_{5}}{\sum_{1}^{n}k_{i}}

二、代码部分

1、代码讲解

我们首先导入我们需要的模块以及数据,这里我们的yi使用的是750分制的成绩

import numpy as np
import matplotlib.pyplot as plt

xi = np.array([21, 80, 44, 22, 43, 90, 40, 88, 67, 70, 89, 56])
yi = np.array([692, 537, 586, 601, 615, 647, 588, 498, 571, 554, 563, 687])

定义我们的高斯核函数,默认带宽为10

def k(x,xi,h=10):
    a=1/np.sqrt(2*np.pi)
    r=a/h
    x_=((x-xi)/h)**2
    b=r*np.exp(x_/-2)
    return b

我们绘制完x轴后要开始计算权重了;我们将x轴上的每一点和xi做核函数,我们把他加入到sum里,就得到了我们权重的分母,最终乘上ki就得到了我们权重的列表了,可以把他看作一个向量w=\left ( w_{1},w_{2},w_{3}...w_{n} \right ),将yi和他做内积就得到了我们的预测值y了

x_list=np.linspace(1,120,120)
w=[]
sum=0
y_list=[]
for x in x_list:
    for i in xi:
        sum+=k(x,i)

    for i in xi:
        zi=k(x,i)
        w.append(zi/sum)

    y=np.dot(w,yi)
    y_list.append(y)
    sum=0
    w=[]

 然后就是绘图了

plt.xlabel('distance')
plt.ylabel('score')
plt.title('how distance influences score')

plt.plot(x_list,y_list,color='orange')
plt.scatter(xi,yi)
plt.show()

2、代码全文

import numpy as np
import matplotlib.pyplot as plt



xi = np.array([21, 80, 44, 22, 43, 90, 40, 88, 67, 70, 89, 56])
yi = np.array([692, 537, 586, 601, 615, 647, 588, 498, 571, 554, 563, 687])



def k(x,xi,h=10):
    a=1/np.sqrt(2*np.pi)
    r=a/h
    x_=((x-xi)/h)**2
    b=r*np.exp(x_/-2)
    return b


x_list=np.linspace(1,120,120)
w=[]
sum=0
y_list=[]
for x in x_list:
    for i in xi:
        sum+=k(x,i)


    for i in xi:
        zi=k(x,i)
        w.append(zi/sum)

    y=np.dot(w,yi)
    y_list.append(y)
    sum=0
    w=[]

plt.xlabel('distance')
plt.ylabel('score')
plt.title('how distance influences score')

plt.plot(x_list,y_list,color='orange')
plt.scatter(xi,yi)
plt.show()


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值