简单logistic regression的实现

#include "LR.h"

const int LrMaxIteration = 2000;
const float convergeData = 0.0005;
const float LrLearningRate = 0.001;
float vectorInner(vector<float>& parameter,vector<float>& DataInput){
	float totalTemp = 0.0;
	assert(parameter.size()==DataInput.size());
	for(int i=0;i<parameter.size();i++)
		totalTemp+=parameter[i]*DataInput[i];
	return totalTemp;
}

//sigmoid function
float proFuncSig(vector<float>& parameter,vector<float>& DataInput){
	float totalTemp = vectorInner(parameter,DataInput);
	return (1.0/(1+exp(-totalTemp)));
}

//随机梯度上升 求似然函数最大值
int LogicalRegressionFunction(vector<float>& parameter,vector< vector<float>>& DataInput,vector<float>& TrainingResultInput){
	for(int i=0;i<LrMaxIteration;i++){
		
		for(int i=0;i<TrainingResultInput.size();i++){
			float costValue = 0.0;
			float tempValue = 0.0;
			for(int ii=0;ii<TrainingResultInput.size();ii++){
				tempValue = proFuncSig(parameter,DataInput[ii]);
				costValue+=(TrainingResultInput[ii]*log(tempValue/(1-tempValue))+log(1-tempValue));
			}
			costValue/=TrainingResultInput.size();
			costValue = -costValue;
			printf("the cost of function is %f \n",costValue);
			if(costValue<convergeData)
				break;

			tempValue = proFuncSig(parameter,DataInput[i]);
			for(int j=0;j<parameter.size();j++){
				parameter[j] = parameter[j]+(TrainingResultInput[i]-tempValue)*LrLearningRate*DataInput[i][j];
			}
			printf("the next parameter is ");
			for(int j=0;j<parameter.size();j++){
				printf("%f ",parameter[j]);
			}
			printf("\n");
		}	
		
	}

	return 1;
}


int LrTestFunc(vector<float>& parameter, vector<float>& DataTest){
	float tempValue = 0.0;
	tempValue = proFuncSig(parameter,DataTest);
	if(tempValue>0.5)
		return 1;
	else
		return 0;
}


int testLr(){
	vector< vector<float> > TrainingData(7);
	for(int i=0;i<TrainingData.size();i++){
			TrainingData[i].resize(2);
			TrainingData[i][0] = 1;
			TrainingData[i][1] = -3+i;	
	}

	vector<float> TrainingResult(7);
	for(int i=0;i<7;i++){
		if(i<4)
			TrainingResult[i] = 0;
		else
			TrainingResult[i] = 1;
	}
	
	vector<float> parameter(2);
	parameter[0]=0;
	parameter[1]=0;

	vector<float> TestData(2);
	TestData[0] = 1;
	TestData[1] = -6;
	LogicalRegressionFunction(parameter,TrainingData,TrainingResult);
	cout<<LrTestFunc(parameter,TestData)<<endl;
	return 1;
}

资料:斯坦福机器学习的第三课和第一份讲义
博客:http://blog.csdn.net/abcjennifer/article/details/7716281

你可能感兴趣的:(简单logistic regression的实现)