本节为吴恩达教授机器学习笔记第一部分:线性回归最后一部分,包括:最小化J的统计学推导以及局部加权线性回归(含代码及一个应用例子)。

3. 统计学解释

  假设输入与目标变量有如下关系:

  其中ϵ(i)\epsilon^{(i)}ϵ(i)是一个误差项,用于捕获没有建模的影响因素,或者是随机噪音。更进一步地,假设该项独立同分布,并且符合正态分布,则有:

  也就是说:

  这个记号表示的是给定x(i)x^{(i)}x(i)和θ\thetaθ时y(i)y^{(i)}y(i)的分布情况,因为θ\thetaθ不是随机变量,所以也可以写为:

  给定输入与参数θ\thetaθ的条件下,yyy的概率为:

  利用似然函数:

  在变量互相独立的前提下有:

  在给定上述概率模型的情况下,可以通过极大似然方法来选择θ\thetaθ的值,使得数据概率更高,为此,可以通过最大化极大似然函数的对数似然函数,有:

  可以看出,最大化对数似然函数也就是最小化

  至此,概率方法给出了和我们原始最小均方代价函数相同的答案。

4. 局部加权线性回归

  原始线性回归算法的过程是:

  局部加权线性回归则是:

  其中ω(i)\omega ^{(i)}ω(i)是非负权重,如果权重过大,很难减小JJJ的值,如果权重很小,误差项就会很容易忽略,一个折中的选择是:

  可以看出距离待确定样本越远,权重越小,公式中参数τ\tauτ为bandwidth参数,表示分布最大值到最小值变化的速度,越大,变小越快,分布的图形就越“尖锐”。
  局部加权线性回归不同于标准线性回归,其是一种无参数算法。标准线性回归中,得到参数θ\thetaθ之后的预测过程,是不需要训练数据集参与的,而局部加权线性回归则依赖于训练集,这样会导致运算量的增加,为此有KDTree方法来优化(《统计学习方法》第三章)。


  之前闲的无聊,用局部加权线性回归还跑过一个不小的数据集,如下,核心的代码很简单,但是处理数据花的时间就老长了,感兴趣可以看看数据集和全部的预处理代码,链接在此。

from Preprocess import *
from numpy import *
from scipy import linalgclass Train:def __init__(self):self.prepro = PrePro()self.matrix_complete = self.prepro.process_train()self.feature_train, self.feature_test, self.label_train, self.label_test, self.traindata, self.labelVector \= self.prepro.generate(self.matrix_complete)def lwlr(self, testPoint, xArr, yArr, k):# xMat = np.mat(xArr)# yMat = np.mat(yArr).TxMat = xArryMat = mat(yArr).Tm = shape(xMat)[0]weights = mat(eye((m)))for j in range(m):diffMat = testPoint - xMat[j, :]diffMat = mat(diffMat)a = diffMat * diffMat.T / (-2.0 * k ** 2)weights[j, j] = math.exp(a)xTx = xMat.T * (weights * xMat)temp_d=zeros([2,2])temp_d[0][0]=xTx[0].tolist()[0][0]temp_d[0][1]=xTx[0].tolist()[0][1]temp_d[1][0]=xTx[1].tolist()[0][0]temp_d[1][1]=xTx[1].tolist()[0][1]xTx=temp_dxTx=mat(xTx)if linalg.det(xTx) == 0.0:print("This matrix is singular, cannot do inverse")returnws = xTx.I * (xMat.T * (weights * yMat))return testPoint * wsdef lwlrTest(self, testArr, xArr, yArr, k=1.0):  # loops over all the data points and applies lwlr to each onem = shape(testArr)[0]yHat = zeros(m)for i in range(m):yHat[i] = self.lwlr(testArr[i], xArr, yArr, k)return yHatif __name__ == '__main__':trainer = Train()temp=0y_hat = trainer.lwlrTest(trainer.feature_test, trainer.feature_train, trainer.label_train, k=0.3)for i in range(len(y_hat)):temp=temp+(y_hat[i]-trainer.label_test[i])**2score=temp/(len(y_hat))score=math.sqrt(score)print(score)#print(trainer.label_test,y_hat)

  另外还有一个用tensorflow写的线性回归,链接在此,代码如下:

# -*-coding:utf-8-*-
import randomimport numpy as np
import tensorflow as tf
import tensorflow.contrib.eager as tfe# 开启eager API
tfe.enable_eager_execution()# 生成数据
num_inputs = 2
num_examples = 1000
true_w = [2, -3.4]
true_b = 4.2tmp_list1 = [np.random.normal() for i in range(num_examples)]
tmp_list2 = [np.random.normal() for i in range(num_examples)]
features = np.vstack((tmp_list1, tmp_list2)).transpose()labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels = labels + np.random.normal(scale=0.01)
labels = labels.reshape(1000, 1)# 读取数据
batch_size = 10# 每次随机读取十个数据
def data_iter(batch_size, features, labels):num_examples = len(features)indices = list(range(num_examples))# 样本的读取顺序是随机的。random.shuffle(indices)for i in range(0, num_examples, batch_size):j = np.array(indices[i: min(i + batch_size, num_examples)])# take 函数根据索引返回对应元素。yield np.hstack(((features[:, 0].take(j)).reshape(-1, 1), (features[:, 1].take(j)).reshape(-1, 1))), labels.take(j)# 权重和偏置
W = tfe.Variable(np.array([np.random.randn() for i in range(2)]).reshape(2, 1))
b = tfe.Variable(np.array(np.random.randn()))# 线性回归公式函数(Wx + b)
def linear_regression(inputs):return tf.add(tf.matmul(inputs, W), b)# 均方误差函数,计算损失
def mean_square_fn(model_fn, inputs, labels):return tf.reduce_sum(tf.pow(model_fn(inputs) - labels, 2)) / (2 * num_examples)# 参数
learning_rate = 0.01
display_step = 100
num_epochs_random_data = 3
num_epochs_entire_data = 3000
# 随机梯度下降法作为优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
# 计算梯度
grad = tfe.implicit_gradients(mean_square_fn)# 优化之前,初始化损失函数
print("Initial cost= {:.5f}".format(mean_square_fn(linear_regression, features, labels)),"W=", W.numpy(), "b=", b.numpy())# 每次选取全部数据训练
for step in range(num_epochs_entire_data):optimizer.apply_gradients(grad(linear_regression, features, labels))if (step + 1) % display_step == 0 or step == 0:print "Epoch:", '%d' % (step + 1), \"\n", "cost=", "{:.5f}".format(mean_square_fn(linear_regression, features, labels)), \"\n", "W=", W.numpy(), "\n", \"b=", b.numpy()

欢迎扫描二维码关注微信公众号 深度学习与数学   [每天获取免费的大数据、AI等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]

机器学习笔记【一】- 线性回归(末):统计学推导以及局部加权线性回归算法实例相关推荐

  1. 机器学习:局部加权线性回归(Locally Weighted Linear Regression)

    线性回归 先复习一下线性回归的损失函数: 我们的目标是使该函数最小,用矩阵表示为: 对参数w求导得: 令上式等于0可估计出回归系数w得最优解: 但线性回归往往容易欠拟合,除了使用更复杂得函数拟合,还可 ...

  2. 1.9 程序示例--局部加权线性回归-机器学习笔记-斯坦福吴恩达教授

    程序示例–局部加权线性回归 现在,我们在回归中又添加了 JLwr() 方法用于计算预测代价,以及 lwr() 方法用于完成局部加权线性回归: # coding: utf-8 # linear_regr ...

  3. 【机器学习】线性回归之概率解释及局部加权线性回归

    Probabilistic interpretation 我们应该想这样一个问题:当我们讨论回归问题时,我们为什么要最小化平方损失函数?在CS229的课程中,吴恩达教授给我们做了详细的概率解释.现总结 ...

  4. 机器学习--局部加权线性回归

    文章目录 局部加权线性回归 预测鲍鱼年龄 局部加权线性回归 具体理论见上次笔记<线性回归> 预测鲍鱼年龄 import numpy as npclass LocalWeightedLine ...

  5. 机器学习基础(三十) —— 线性回归、正则化(regularized)线性回归、局部加权线性回归(LWLR)

    1. 线性回归 线性回归根据最小二乘法直接给出权值向量的解析解(closed-form solution): w=(XTX)−1XTy w=(\mathbf X^T\mathbf X)^{-1}\ma ...

  6. 机器学习(回归五)——线性回归-局部加权线性回归

    前面博客有讲到,样本如果不是线性的可以通过多项式扩展,映射到多维空间来拟合.如此之外,还可以做一个局部加权线性回归(Locally Weighted Linear Regression,LWLR). ...

  7. python线性加权回归_第二十一章 regression算法——线性回归局部加权回归算法(上)...

    理论部分 回归是统计学中最有力的工具之一.监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型.连续性而定义的.顾名思义,分类算法用于离散型分布预测,如KNN.决策树.朴素贝叶 ...

  8. 局部加权线性回归,线性回归高级版

    http://www.cnblogs.com/mooba/p/5947161.html 本来不想乱改别人的,但是他的不对,跑不出来有错误 我自己做了个数据 height weight 1.5 50 1 ...

  9. 局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归

    局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归 locally weighted scatterplot smoothing,LOWE ...

  10. 机器学习与算法(8)--局部加权学习算法(LWR)

    局部加权学习算法(LWR) 局部加权回归(LWR)是非参数学习方法. 首先参数学习方法是这样一种方法:在训练完成所有数据后得到一系列训练参数,然后根据训练参数来预测新样本的值,这时不再依赖之前的训练数 ...

最新文章

  1. 中科大博士20万字正经论文:教你如何给女朋友送礼物
  2. 报名 | 大数据打造智慧的政府门户讲座
  3. Wannafly交流赛1 B 硬币[数学思维/贪心]
  4. Java-Web监听器
  5. python之路——常用模块2
  6. c#如何通过ftp上传文件_ftp自动上传文件,如何设置ftp自动上传文件及环境配置...
  7. C/C++中的段错误(Segmentation fault)[转]
  8. 我感到惭愧不已的飞鸽传书
  9. java map操作_Java HashMap的基本操作
  10. Java IO实战操作(四)
  11. Java学习之JDBC(1)
  12. PTA 程序设计天梯赛(161~180题)
  13. centos虚拟机下安装nginx
  14. IE兼容/IE5兼容踩过的坑
  15. 设备管理器---usb大容量储存设备感叹号,USB大容量存储设备无法启动
  16. 小米8使用usb连接计算机,小米怎么连接电脑usb(小米8连接电脑看不到文件)
  17. linux怎么踢普通用户,Linux系统管理员踢用户的方法
  18. 将两个单链表合并为一个单链表
  19. 基于G.1070的视频质量无参考打分集成回顾
  20. 计算机能够自动完成运算或处理过程的基础是,计算机文化基础题库.doc

热门文章

  1. contact form 7如何设置placeholder让提示文字显示在输入框中
  2. VMware 虚拟机运行卡慢的解决办法
  3. ASP.NET MVC 4 (二)控制器
  4. wdlinux LAMP
  5. php调用一个c语言写的接口问题
  6. 第一个scrum会议
  7. BZOJ 2432 兔农
  8. python 服务端判断客户端异常断开
  9. 赴日游个人签证门槛降低 年薪3万可申请
  10. Yii 2.0 权威指南 (5) 应用结构