計画を学ぶ機械学習10日-2
直線回帰
原則
データセット{(X1、Y1)、( X2、Y2)、···、(XN、YN)}、 XI =(XI1、XI2、... 、XID)、y∈R;
、Nはサンプルの数を表します。 、Dは、各変数のディメンションを表しています。
我々は、線形関数でxとyとの間の関係を記述することができます。
可能近似Y限りそのF(X)にθの値のセットを決定することによって。
派生
平均二乗誤差が回帰直線的に使用損失関数で、最尤推定から推定されます。
原理は、ターゲット変数の間の関係を仮定することです
ηはガウス分布は、θは確率分布について知ることができると仮定すると、直ちにノイズであり、θはその結果、即ち例えば、尤度関数を最大化する、θを選択することによって、最大尤度関数を確立します
最大化されています。少し具体的な導出。
この結果はサンプル数で割ったN、すなわち、平均二乗誤差、したがって統計モデルは、次に、統計的に妥当である最適化するために、コスト関数としてこの値を使用します。
最適化
勾配降下
初期パラメータを設定し、θA、そう連続反復J(θ)の最小を通して、偏導関数のJ(θ)θをする必要があること。
この方法では、各データポイントのパラメータは、このようになって、同時に移動したバッチ勾配降下方法。
従って、もしパラメータをサンプルデータ点を移動させるための時間を更新するための時間。その
も確率的勾配降下法。
大量のデータ、確率的勾配降下法は、多くの場合、バッチ勾配降下よりも優れています。
コード:
#生成训练dataset
import numpy as np
np.random.seed(1234)
x = np.random.rand(500, 3)
y = x.dot(np.array([4.2, 5.7, 10.8]))
バッチ勾配降下:
#批量梯度下降法求解参数
class LR_GD():
def __init__(self):
self.w = None
def fit(self, X, y, alpha=0.002, loss=1e-10):
y = y.reshape((-1, 1))
[m,d] = np.shape(X)
self.w = np.zeros((d,1))
tol = 1e5
theta = self.w
diff = np.dot(X, theta) - y
tol = (1/2)*np.dot(np.transpose(diff), diff)
while tol > loss:
gradient = np.dot(np.transpose(x), diff)
theta = theta - gradient*alpha
diff = np.dot(X, theta)-y
tol = (1/m)*np.dot(np.transpose(diff), diff)
tol = tol[0][0]
#print(tol)
return theta
def predict(self, X, weight):
y_pred = np.dot(X,weight)
return y_pred
#测试
if __name__ == "__main__":
lr_gd = LR_GD()
weight = lr_gd.fit(x, y)
print("估计的参数值为:%s"%(weight))
x_test = np.array([2,4,5]).reshape(1, -1)
print("预测值为:%s" %(lr_gd.predict(x_test, weight)))
結果:
估计的参数值为:[[ 4.20000516]
[ 5.70002061]
[10.7999735 ]]
预测值为:[[85.19996027]]
確率的勾配降下法:
#随机梯度下降法求解
class LR_stoGD():
def __init__(self):
self.w = None
def fit(self, X, y, alpha=0.002, loss=1e-10):
y = y.reshape((-1,1))
[m,d] = np.shape(X)
self.w = np.zeros((1,d))
theta = self.w
for i in range(m):
diff = sum(np.dot((X[i,:]), np.transpose(theta))) - y[i,:]
gradient = X[i,:]*diff
theta = theta - alpha * gradient
#print(theta)
return theta
if __name__ == "__main__":
lr_stogd = LR_stoGD()
w = lr_stogd.fit(x, y)
print('估计的参数值是:%s'%(w))
結果:
估计的参数值是:[[3.58871918 4.00836808 4.17746749]]
唯一の500サンプルので、その推定されたパラメータの値が非常に不正確です。
サンプルと機能の何千も、計算の複雑さのバッチ勾配降下法の十億が高すぎる上昇勾配が、確率的勾配アルゴリズムとなって更新するだけつのサンプルポイントを使用し、それは確率的勾配が上昇するのに適して法律。