ML-from-scratch——贝叶斯回归

Table of Contents

1:加载数据

读取后转换成2D数据

代码

拆分训练测试集

2:构建一个贝叶斯回归模型

初始化一些参数,权重按照高斯分布,间隔为10

构建贝叶斯回归模型


比较全面的科普

D是观测值,h是假设,求P(h | D)

为可能的每个单词h,计算一下  P(h) * P(D | h)/ P(D)这个值,然后取最大的,得到的就是最靠谱的猜测。P(D)是固定的,我们在脑子里想的是P(hD)。根据一个人是男生且穿长裤的概率和是女生穿长裤的概率的大小,猜测穿长裤的是男生还是女生,与问题一个人穿长裤的概率无关

只考虑P(D | h)就是最大似然估计,即便一个猜测与数据非常符合,也并不代表这个猜测就是更好的猜测,因为这个猜测本身的可能性P(h)也许就非常低。-1 3 7 11 你说是等差数列更有可能呢?还是 -X^3 / 11 + 9/11*X^2 + 23/11 。一般地说肯定是越低阶的多项式越靠谱(当然前提是也不能忽视“似然”P(D | h) ,明摆着一个多项式分布您愣是去拿直线拟合也是不靠谱的,这就是为什么要把它们两者乘起来考虑。),原因之一就是低阶多项式更常见,先验概率( P(h) )较大。所谓奥卡姆剃刀精神就是说:如果两个理论具有相似的解释力度,那么优先选择那个更简单的(往往也正是更平凡的,更少繁复的,更常见的)。

观测数据总是会有各种各样的误差,比如观测误差,过拟合不好

 

1:加载数据

读取后转换成2D数据

之所以转换成是二维的是因为,366个数据每个数据由相应的特征表示,用2维数组记录,虽然此处的维度只有1个

.X=np.atleast_2d(X)这一方法可以保证所有的输入X至少是二维数组,如果是一维数组则会转化为一个二位的1*len(X)的数组。如:b=[1,2,3]np.atleast_2d(b)输出结果为array([[1,2,3]])

代码

    # Load temperature data
    data = pd.read_csv('../data/TempLinkoping2016.txt', sep="\t")

    time = np.atleast_2d(data["time"].as_matrix()).T
    temp = np.atleast_2d(data["temp"].as_matrix()).T

    X = time # fraction of the year [0, 1]
    y = temp

拆分训练测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)

2:构建一个贝叶斯回归模型

初始化一些参数,权重按照高斯分布,间隔为10

    # Normal
    mu0 = np.array([0] * n_features)
    omega0 = np.diag([.0001] * n_features)
    # Scaled inverse chi-squared
    nu0 = 1
    sigma_sq0 = 100
    # The credible interval
    cred_int = 10

构建贝叶斯回归模型

模型原理

https://github.com/STIMALiU/BayesLearnCourse/blob/master/Slides/BayesLearnL5.pdf

n_draws:  从参数的后面开始的模拟绘制的数量。
mu0:参数的先验正态分布的平均值。
omega0:参数先验正态分布的方差。
nu0:先前缩放的逆卡方分布的自由度。
sigma_sq0:先前缩放的逆卡方分布的比例参数。
poly_degree:特征应转换为的多项式次数。允许用于多项式回归。
cred_int:可信区间(本文中的ETI)。 95 => 95%后可信区间的参数。

3:模型训练

clf.fit(X_train, y_train)

特征的多项之转换

虽然不知道这里的数学原理是什么,不过在实现上就是把x变成(x^0,x^1,x^2,x^3,x^4)

X的转置乘以X——样本4维特征的两两叉乘

最小二乘近似β

(XT*X)-1*XT*Y

猜你喜欢

转载自blog.csdn.net/duyue3052/article/details/82791096