机器学习笔记(1)

来源:互联网 发布:手机移动数据自己打开 编辑:程序博客网 时间:2024/06/06 03:08

机器学习笔记之线性回归(python实现)

  • 线性回归

    首先定义一些符号:

    ​ m: 训练数据量

    ​ x: 输入变量(向量)

    ​ y: 输出变量(实数)

    ​ (x,y):一个训练样例

    (x(i),y(i)) :第i个训练实例

    以预测房屋价格为例,x1 -房屋面积 x2 -卧室数量

    假设损失函数为: h(x)=θ0+θ1x1+θ2x2=i=02θixi=hθ(x)

    对于一般问题来说: hθ(x)=i=0nθixi=θTx (x 为向量,n为x的长度)

    设目标函数的优化函数为: J(θ)=12mi=1m( hθ(x(i))y(i))2 (m个样本求平均)

      C = X.dot(theta) - y  J = (C.T.dot(C)) / (2 * m) 

    使用梯度下降法确定使得J(θ) 取得最小值的 θ

    更新规则: θj:=θjαθjJ(θ)

    当只有一个训练样例时:

    θjJ(θ)===θj12( hθ(x)y )2(hθ(x)y) θj(θ0x0+θ1x1++θmxmy)(hθ(x)y)xj

    将所得结果代入上式: θj:=θjα (hθ(x)y) xj

    当m个训练数据更新规则变为: θj:=θjαm i=1m( hθ(x(i))y(i)) x(i)j (批梯度下降) α - 学习速度

    theta = theta - (alpha / m) * (X.T.dot(X.dot(theta) - y))

    由于更新每个θ 需要遍历所有训练样例,故采用随机(增量)梯度下降法:

    Fori=1tom {

    θj:=θjα( hθ(x(i))y(i)) x(i)j (for every j)

    ​ }

    随机梯度下降每次更新仅需一个训练样例,但是会导致收敛速度减慢,使得遍历次数增多。


  • 正规方程组

    首先定义梯度的符号 ,则优化函数的梯度可以表示为: θJ=θ0θn Rn+1

    梯度下降:θ:=θαθJ

    假设 f:Rm×nR , 有函数f(A)ARm×nAf(A)=fA11fAn1fA1nfAnn

    eg:f(A)=32A11+5A212+A21A22Af(A)=[32A2210A12A21]

    定义 n×n 矩阵 A 的trA=i=1nAii

    性质

    trAB=trBA

    trABC=trCAB=trBCA

    ​ 若 f(A)=trAB ,ARm×nAtrAB=BT

    trA=trAT

    AtrABATC=CAB+CTABT

    If aR , tr a=a


​ 推导:

​ 定义设计矩阵 X=(x(1))T(x(2))T(x(n))T

Xθ=(x(1))Tθ (x(2))Tθ(x(n))Tθ=hθ(x(1))hθ(x(m)) y=y(1)y(2)y(m)

xθy=hθ(x(1))y(1)hθ(x(m))y(m)

​ 向量内积 zz=i=1mz2i , 则 12(xθy)T(xθy)=12i=1m(h(x(i))y)2=J(θ)

​ 计算 J 的梯度的公式推导:

θJ(θ)=========12θ(θTXTYT)(XθY)12θ(θTXTXθYTXθθTXTY+YTY)12θtr(θTXTXθYTXθθTXTY+YTY)12[θtr( θTXTXθ)θtr (YTXθ)θtr (θTXTY)]12θtr( θTXTXθ)θtr (YTXθ)12θtr(θ θTXTX)θtr (YTXθ)12θtr(θIθTXTX)θtr (YTXθ)IXTXθθtr(YTXθ)XTXθXTY


正规方程组 J(θ)=set0XTXθ=XTY

θ=(XTX)1XTY

def NormalEquations(X,y):    A=np.dot(X.T,X)              # X.T*X    B=np.linalg.inv(A)           # (X.T*X)`    theta=np.dot(np.dot(B,X.T),y)    return theta
  • 单变量线性回归
import matplotlib.pyplot as pltimport numpy as npfrom mpl_toolkits.mplot3d import Axes3Ddef computeCost(X,y,theta):  # 损失函数    m=y.shape[0]    C = X.dot(theta) - y    J = (C.T.dot(C)) / (2 * m)    return Jdef  gradientDescent(X, y, theta, alpha, num_iters):            # 梯度下降    m = y.shape[0] # % number of training examples    J_history = np.zeros( (num_iters,1) )    for iter in range(num_iters):        theta = theta - (alpha / m) * (X.T.dot(X.dot(theta) - y))        J_history[iter][0] = computeCost(X, y, theta)    return (J_history,theta)def NormalEquations(X,y):                                       # 正规方程组    A=np.dot(X.T,X)              # X.T*X    B=np.linalg.inv(A)           # (X.T*X)`    theta=np.dot(np.dot(B,X.T),y)    return thetadata=np.loadtxt("ex1data1.txt",delimiter=',')x=data[:,0].reshape((-1,1))y=data[:,1].reshape((-1,1))m=y.shape[0]  # train numX = np.hstack([np.ones((x.shape[0], 1)),x])         # 令X0=1theta=np.zeros((2,1))iterations = 1500                                   # 迭代次数alpha = 0.01                                        # 学习速度# J = computeCost(X, y, theta)# theta=NormalEquations(X,y)       # 使用正规方程组计算theta# (J_history,theta)=gradientDescent(X,y,theta,alpha,iterations)plt.plot(X[:,1],y,'ro',label="point")plt.plot(X[:,1],np.dot(X,theta))plt.legend()plt.show()# Grid over which we will calculate Jtheta0_vals=np.linspace(-10,10,100)theta1_vals =np.linspace(-1,4,100)# initialize J_vals to a matrix of 0'sJ_vals = np.zeros((theta0_vals.shape[0],theta1_vals.shape[0]))# Fill out J_valsfor i in range(theta0_vals.shape[0]):    for j in range(theta1_vals.shape[0]):        th=np.array([ [theta0_vals[i] ] ,[theta1_vals[j] ] ]).reshape((2,1))        J_vals[i][j] = computeCost(X, y, th)J_vals=J_vals.Tfig = plt.figure()ax = Axes3D(fig)ax.plot_surface(theta1_vals,theta0_vals,J_vals, rstride=1, cstride=1, cmap='rainbow')plt.show()

这里写图片描述

这里写图片描述

  • 多元线性回归

    import matplotlib.pyplot as pltimport numpy as np#特征缩放def featureNormalize(X):   mu = np.zeros((1,X.shape[1]))  sigma = np.zeros((1,X.shape[1]))  for i in range(X.shape[1]):      mu[0,i] = np.mean(X[:,i]) # 每一列均值      sigma[0,i] = np.std(X[:,i])     # 标准差      # X - mu   使平均值为0      # /sigma  X_norm  = (X - mu) / sigma  return (X_norm,mu,sigma)def computeCost(X,y,theta):  # 损失函数  m=y.shape[0]  C = X.dot(theta) - y  J = (C.T.dot(C)) / (2 * m)  return Jdef gradientDescentMulti(X, y, theta, alpha, num_iters):  m=y.shape[0]  J_history=np.zeros((num_iters,1))  for iter in range(num_iters):     theta = theta - (alpha / m) * (X.T.dot(X.dot(theta) - y))     J_history[iter][0] = computeCost(X, y, theta)  return (J_history, theta)data=np.loadtxt("ex1data2.txt",delimiter=',')x=data[:,(0,1)].reshape((-1,2))y=data[:,2].reshape((-1,1))m=y.shape[0]# n=np.ones((m,1))# X=np.column_stack((n,x))iterations = 1000alpha = 0.01theta=np.zeros((3,1))x,mu,sigma = featureNormalize(x)    # 特征缩放X = np.hstack([x,np.ones((x.shape[0], 1))])         # 增加一列 1J=computeCost(X,y,theta)(J_history,theta)=gradientDescentMulti(X,y,theta,alpha,iterations)

原创粉丝点击