机器学习笔记(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(θ)=12m∑i=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+…+θmxm−y)(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×n↦R , 有函数f(A)A∈Rm×n 则∇Af(A)=⎡⎣⎢⎢⎢⎢∂f∂A11⋮∂f∂An1⋯⋱⋯∂f∂A1n⋮∂f∂Ann⎤⎦⎥⎥⎥⎥ eg:
f(A)=32A11+5A212+A21A22 则∇Af(A)=[32A2210A12A21] 定义
n×n 矩阵 A 的迹 :trA=∑i=1nAii 性质:
trAB=trBA
trABC=trCAB=trBCA 若
f(A)=trAB ,A∈Rm×n 则∇AtrAB=BT
trA=trAT
∇AtrABATC=CAB+CTABT
If a∈R , tr a=a
推导:
定义设计矩阵
向量内积
计算 J 的梯度的公式推导:
正规方程组
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)
- 机器学习笔记(1)
- 机器学习笔记(1)
- 机器学习笔记(1)
- 机器学习笔记(1)
- 机器学习实战笔记(1)机器学习基础
- 机器学习笔记1(吴恩达机器学习课程)
- 周志华 机器学习 学习笔记 (1)
- 机器学习笔记1
- 机器学习笔记(1)
- 机器学习笔记1
- 机器学习(笔记)
- 机器学习笔记1:初探机器学习
- 机器学习-学习笔记1
- 机器学习学习笔记1
- 机器学习课程笔记整理(1)
- 斯坦福机器学习笔记(1)
- 《机器学习基石》课程笔记(1)
- >吴恩达机器学习笔记(1)
- leetcode
- 【算法】——选择排序
- jni写个so库给别人用
- 生成对String 进行自动trim()的setter
- php培训学习记录 第五天
- 机器学习笔记(1)
- 什么是图灵测试?
- sitemesh初步
- [LeetCode]13. Roman to Integer
- Spring的IOC原理
- 用原生ajax实现对flask传递json数据。
- 什么是图灵测试?
- deepdive -马尔科夫网逻辑网
- char ch[10]={"yhping"}; char ch2[10]={'y','h','p','i','n','g'}; char *str = "yhping"; 区别是什么。