02-一次准则函数及梯度下降法

1. 感知器算法(两类)

基本思想:用训练模式检验初始的或迭代中的增广权矢量w的合理性,当不合理时,对齐进行校正。
算法实质:最优化技术中的梯度下降法。也是人工神经网络理论中的线性阈值神经元学习方法。
如果训练模式是线性可分的,感知器训练算法是在有限次迭代后便可以收敛到正确的解矢量\(w^*\)

代码实现:

初始化和释放:

int init_data()
{
	int i, j;
	int *data;
	mat_point = cvCreateMat(COUNT, 4, CV_32SC1);
	cvSetZero(mat_point);

	srand(time(NULL));  
	for (i = 0; i< mat_point->height; i++)
	{
		data = (int *)(mat_point->data.ptr + i * mat_point->step);
		data[0] = RANDOM_X;
		data[1] = RANDOM_Y;
		data[2] = 1;
		if (data[0] < 200)
			data[3] = 1;
		else
			data[3] = -1;
	}

	mat_weight = cvCreateMat(1, 4, CV_64FC1);
	cvSetZero(mat_weight);

	return 0;
}

int release_data()
{
	cvReleaseMat(&mat_point);
	cvReleaseMat(&mat_weight);
	return 0;
}
计算:

int compute(int *point, double *weight)
{
	double sum =0.0;
	int i;
	for (i = 0; i < 3; ++i)
	{
		sum += point[i] * weight[i];
	}
	if(sum > 0.0)
		return 1;
	else
		return -1;
}
主函数:

int main()
{
	bool bLearningOK = false;
	int count = 0;
	int *point;
	double *weight;
	//感知器学习算法
	init_data();
	while(!bLearningOK)
	{
		bLearningOK = true;
		for (int i = 0 ; i < COUNT ; ++i)
		{
			point = (int *)(mat_point->data.ptr + mat_point->step * i);
			weight = mat_weight->data.db;
			int output = compute(point,weight);
			if(output!= point[3])
			{
				for(int w = 0 ; w <3 ; ++w)
				{
					weight[w] += alpha * point[3] * point[w];
				}
				bLearningOK = false;
			}
		}
		count++;
// 		cout<<count<<endl;
//  		show_update(50);
	}
	show_update(0);
	release_data();
	return 0;
}
效果图:



代码下载:http://download.csdn.net/detail/k_shmily/9598341

2.一次准则函数及梯度下降法

采用最优化技术求解线性判别函数中的增广权矢量时,首先构造准则函数,负梯度方向是函数下降最快的方向。
构造准则行数:\( J(w)=k( |w^T x| - w^T x)\) (k>0)
当 \(w^T x<0 \)时 J(w)>0
当 \(w^T x>=0 \)时 J(w)=0 \(J(w)\)有极小值 \(J_{min}(w)=0\)
准则函数的梯度:\( \bigtriangledown J(w) = \frac{\partial J }{\partial w } = \frac{1}{2} [x\, sng( w^T x)- x]\)
由梯度下降法,增广权矢量的修正迭代公式为
\(w(k+1) = w(k) - \rho_k \bigtriangledown J(w(k))\)
\(w(k+1) =\left\{\begin{matrix} k(x) & w^T (k)x_k > 0 \\ k(x)+\rho_k x_k & w^T (k)x_k <= 0, \rho_k>0 \end{matrix}\right. \)

3.感知器训练算法在多类问题中的应用

建立c个判别函数 \( d_i(x) = w_i^T x_i\)  (i=1,2,...c)
如果 \( x\in w_i\), 则有 \( w_i^T x> w_j^T x\,\,\,\,(\forall j\neq i)\)
具体步骤:
(1)初始化c个权矢量
(2)输入已知类别的增广训练模式,计算c个判别函数
(3)修正权矢量(对应样本的判别函数值为最大时,不用修正)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随机梯度下降法是一种常用的优化算法,适用于大规模数据集的训练。其基本思想是每次只使用一个样本来更新模型参数,因此可以大大降低计算复杂度。在使用随机梯度下降法时,我们需要满足后验停机准则,即当损失函数的下降已经足够小时,停止迭代。 下面是一个简单的使用随机梯度下降法进行线性回归的代码示例,其中包含后验停机准则的实现: ```python import numpy as np def stochastic_gradient_descent(X, y, learning_rate=0.01, num_epochs=100, batch_size=1, epsilon=1e-6): # 初始化模型参数 m, n = X.shape theta = np.zeros(n) # 初始化损失函数值 cost = 0 # 迭代 for epoch in range(num_epochs): # 打乱数据集 permutation = np.random.permutation(m) X = X[permutation,:] y = y[permutation] # 随机抽取batch_size个样本进行更新 for i in range(0, m, batch_size): X_batch = X[i:i+batch_size,:] y_batch = y[i:i+batch_size] # 计算梯度 grad = np.dot(X_batch.T, np.dot(X_batch, theta) - y_batch) / batch_size # 更新模型参数 theta -= learning_rate * grad # 计算损失函数值 cost_old = cost cost = np.sum((np.dot(X, theta) - y) ** 2) / (2 * m) # 判断是否满足后验停机准则 if abs(cost - cost_old) < epsilon: break return theta ``` 在上面的代码中,我们使用了一个嵌套的循环,外层循环是迭代次数,内层循环是每次迭代时随机抽取一个batch_size个样本进行更新。在每次迭代后,我们都计算一下损失函数值,然后判断是否满足后验停机准则。如果满足,则停止迭代。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值