课程视频地址:http://open.163.com/special/opencourse/machinelearning.html

课程主页:http://cs229.stanford.edu/

更具体的资料链接:https://www.jianshu.com/p/0a6ef31ff77a

作业地址:https://github.com/Doraemonzzz/CS229

参考资料:https://github.com/zyxue/stanford-cs229

这部分回顾老版作业1。

1. Newton’s method for computing least squares

(a)因为

所以

注意到

所以

(b)牛顿法的规则为

$\theta$的初始值为$0$,所以此时

所以第一步更新后

2.Locally-weighted logistic regression

(a)首先推导题目中给出的梯度计算式,注意到

所以

从而

定义$z\in \mathbb R^m$

那么

接着计算Hessian矩阵,首先求偏导数

记$D\in \mathbb R^{m\times m}$为对角阵,其中

那么

代码见(b)

(b)

# -*- coding: utf-8 -*-
"""
Created on Mon Jan 28 16:12:53 2019

@author: qinzhen
"""
import numpy as np
import matplotlib.pyplot as plt

Lambda = 0.0001
threshold = 1e-6

#读取数据
def load_data():
    X = np.loadtxt('data/x.dat')
    y = np.loadtxt('data/y.dat')
    
    return X, y

#定义h(theta, X)
def h(theta, X):
    return 1 / (1 + np.exp(- X.dot(theta)))

#计算
def lwlr(X_train, y_train, x, tau):
    #记录数据维度
    m, d = X_train.shape
    #初始化
    theta = np.zeros(d)
    #计算权重
    norm = np.sum((X_train - x) ** 2, axis=1)
    W = np.exp(- norm / (2 * tau ** 2))
    #初始化梯度
    g = np.ones(d)
    
    while np.linalg.norm(g) > threshold:
        #计算h(theta, X)
        h_X = h(theta, X_train)
        #梯度
        z = W * (y_train - h_X)
        g = X_train.T.dot(z) - Lambda * theta
        #Hessian矩阵
        D = - np.diag(W * h_X * (1 - h_X))
        H = X_train.T.dot(D).dot(X_train) - Lambda * np.eye(d)
        
        #更新
        theta -= np.linalg.inv(H).dot(g)
    
    ans = (theta.dot(x) > 0).astype(np.float64)
    return ans

#作图
def plot_lwlr(X, y, tau):
    x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1
    y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1    
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
                         np.arange(y_min, y_max, 0.01))
    d = xx.ravel().shape[0]
    Z = np.zeros(d)
    data = np.c_[xx.ravel(), yy.ravel()]
    
    for i in range(d):
        x = data[i, :]
        Z[i] = lwlr(X, y, x, tau)
    
    plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
    X0 = X[y == 0]
    X1 = X[y == 1]
    plt.scatter(X0[:, 0], X0[:, 1], marker='x')
    plt.scatter(X1[:, 0], X1[:, 1], marker='o')
    plt.title("tau="+str(tau))
    plt.show()

Tau = [0.01, 0.05, 0.1, 0.5, 1, 5]
X, y = load_data()
for tau in Tau:
    plot_lwlr(X, y, tau)

参数$\tau$越大,边界越平滑,如果是unweighted的形式,相当于$\tau \to \infty$,所以可以推断出unweighted的边界类似于$\tau =5$时的情形。

备注:这里和标准答案的图不一样是因为答案中的代码为$\tau $,实际应该是$\tau^2$

3.Multivariate least squares

(a)注意到

所以

(b)

注意到

所以

令上式为$0$可得

(c)如果化为$p$个独立的最小二乘问题,则

其中$Y_{:, j}$为$Y$的第$j$列,从而

4.Naive Bayes

(a)不难看出

所以

(b)先关于$\phi_{j|y=k}$求梯度

令上式为$0$可得

从而

关于$\phi_{y}$求梯度可得

令上式为$0$可得

(c)

所以

所以

等价于

所以

等价于

5.Exponential family and the geometric distribution

(a)

所以

化简可得

综上

(b)

(c)由(b)可得

带入

可得

这里

所以对数似然函数为

关于$\theta_j$求偏导可得

所以

所以随机梯度上升的更新规则为