目录
引言
你是一个班主任,你的班级新来了一位同学,你为他安排了座位;
座位周围的同学成绩有好有坏,你希望可以预测下次月考时新同学的成绩;
传闻近朱者赤近墨者黑,如果和好学生做的近成绩会更好一些,和成绩差的学生坐一起成绩可能会低一些,于是你期望通过新同学周围同学的成绩来估算新同学的成绩。
这可能不是一个很恰当的例子,但我们需要关注其中的思想:我们认为一个样本点会受到其周边的样本点的影响;
一、回归模型
那么,我们该如何定义这种‘影响’(influence)的大小呢?
比较直白的方法,我们通过距离(distance)来定义;和同学做的近一些,那么对他的影响就大一些,如果远一点,那么影响就小一些。
1.1核函数
这里,我们引入核函数(Kernel functions)来描述距离的影响:
这里我们用的是高斯核(Gaussian kernel)
这里的xi我们可以认为是我们‘远离’或‘靠近’的参考目标;
我们给定xi以后(这里设置为0)画出核函数的图像,发现他像极了正态分布
这验证了我们‘近朱者赤’的思想,随着我们的x远离我们的xi,它的‘影响’也在不断的减小
1.2预测
接下来我们假设有多位同学
探究处在x=2号位的同学,我们画一条x=2的直线,注意他与曲线的交点
这几位同学对该同学的影响力就为直线与曲线交点的核函数值
当我们有核函数值了后,就可以开始预测了
其中xi点的权重为wi,ki为为该点的核函数值
显然wi是经过归一化处理的,所有的wi的和都为1
将我们的样本点和权重求积在求和即得到我们的预测点的值
以图为例,我们探讨x=2处的预测值,假设id为i的点核函数在x=2处的值为,图中核函数值就为,样本的值为,则预测值
二、代码部分
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就得到了我们权重的列表了,可以把他看作一个向量,将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()