亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cvm.cpp

?? Ball Vector Machine (BVM)支撐向量機(jī)C++程序項(xiàng)目代碼
?? CPP
字號:
#include <math.h>#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <float.h>#include <string.h>#include <assert.h>
#include "cvm.h"

#define CACHE_DELTA 10

//// Sparse caching for kernel evaluations//// l is the number of total data items// size is the cache size limit in bytes//sCache::sCache(const svm_parameter* param_, int num)
{
	// init cache and usage
	numData  = num;
	head     = (shead_t *) calloc(numData,sizeof(shead_t));	// initialized to 0		lru_head.next = lru_head.prev = &lru_head;	

	// compute maximal space
	maxItem = max((int)((max(param_->cache_size,4.0)*(1<<20))/sizeof(Qfloat)),numData*2); // cache must be large enough for two columns		
}
sCache::~sCache() 
{ 		
	for(shead_t *h = lru_head.next; h != &lru_head; h=h->next)		free(h->data);		
	free(head);	
}void sCache::lru_delete(shead_t *h){	// delete from current location	h->prev->next = h->next;	h->next->prev = h->prev;}void sCache::lru_insert(shead_t *h){	// insert to last position	h->next = &lru_head;	h->prev = lru_head.prev;	h->prev->next = h;	h->next->prev = h;}Qfloat* sCache::get_data(int idx,  int len, int& numRet){		shead_t *h = &head[idx];	h->refcount ++;	if(h->len > 0) lru_delete(h);	if(len > h->max_len)	{		int more   = len + CACHE_DELTA - h->max_len;		h->max_len = h->max_len + more;				// free old space		while(maxItem < more)		{			shead_t *old = lru_head.next;			lru_delete(old);			if (old->refcount <=0)			{				free(old->data);				old->data    = NULL;				maxItem     += old->len;								old->len     = 0;					old->max_len = 0;			}			else			{				old->refcount --;				lru_insert(old);			}		}		// allocate new space		h->data = (Qfloat *)realloc(h->data,sizeof(Qfloat)*h->max_len);		if (h->data == NULL)		{				while(h->data == NULL && lru_head.next != &lru_head)			{				shead_t *old = lru_head.next;				lru_delete(old);				if (old->refcount <= 0)				{					free(old->data);					old->data    = NULL;					maxItem     += old->len;									old->len     = 0;						old->max_len = 0;					h->data = (Qfloat *)calloc(h->max_len,sizeof(Qfloat));				}				else				{					old->refcount --;					lru_insert(old);				}			}			h->len  = 0;			if (h->data == NULL)			{				printf ("sCache cannot allocate memory!\n");				return NULL;			}		}		maxItem -= more;			}	lru_insert(h);	numRet = h->len;	h->len = len;	return h->data;}
//---------------------------------------------------------------------------------------------------------------------

void Solver_CVDD::_Init()
{
	// count the distribution of data	
	chklist = new char[prob->l];
	coreIdx = new int[prob->l];
	for(int i = 0; i < prob->l; i++)
	{	
		chklist[i] = 0;
		coreIdx[i] = -1;
	}

	// initialized the kernel
	outAlpha = &tmpAlpha[0];
	kernelQ  = new CVDD_Q(prob, param);		
	QD       = kernelQ->get_QD();
	coreNum  = 0;	

	// choose a small subset as initialization	
	for(int sampleNum = 0; sampleNum < INITIAL_CS; sampleNum++)
	{	
		int idx;
		do
		{	
			int rand32bit = random();
			idx			  = rand32bit % prob->l;
		} while (chklist[idx] > 0);
		chklist[idx]        = 1;		
		coreIdx[coreNum++]  = idx;
		outAlpha[sampleNum] = 1.0/INITIAL_CS;
		tempD[sampleNum]    = QD[idx];
	}	
}

bool Solver_CVDD::_Create(double cvm_eps)
{
	solver = new Solver_Lag(coreIdx,coreNum,*kernelQ,tempD,outAlpha,SMO_EPS,param->eps);
	return (solver != NULL);
}

double Solver_CVDD::_maxDistFromSampling(double maxDistance2, int &maxDistance2Idx)
{	
	for(int sampleNum = 0; sampleNum < param->sample_size; sampleNum++)
	{	
		int idx;
		do
		{	
			int rand32bit = random();
			idx			  = rand32bit % prob->l;
		} while (chklist[idx] > 0);
		double dist2 = kernelQ->dist2c_wc(idx, coreNum, coreIdx, outAlpha, coreNorm2 + QD[idx]);
		if (dist2 > maxDistance2)
		{						
			maxDistance2 = dist2;
			maxDistance2Idx = idx;
		}					
	}
	return maxDistance2;
}

inline void Solver_CVDD::_UpdateCoreSet(int maxDistance2Idx)
{	
	// update center
	chklist[maxDistance2Idx] = 1;
	coreIdx[coreNum++]       = maxDistance2Idx;	
	tempD[0]                 = QD[maxDistance2Idx];
}	

double Solver_CVDD::ComputeSolution(double *alpha, double Threshold)
{	
	double sumAlpha  = 0.0;
	int i;
	for(i = 0; i < coreNum; i++)
	{
		if (outAlpha[i] > Threshold)
		{
			int ii    = coreIdx[i];
			alpha[ii] = outAlpha[i];	
			sumAlpha += outAlpha[i];
		}
	}	
	for(i = 0; i < coreNum; i++)
		alpha[coreIdx[i]] /= sumAlpha;
	return (r2/sumAlpha);
}



//---------------------------------------------------------------------------------------------------------------------

inline bool PosNeg(bool PosTurn, int pNum, int nNum)
{
	if (pNum<=0)
		PosTurn = false;
	else if (nNum<=0)
		PosTurn = true;
	else
		PosTurn = !PosTurn;
	return PosTurn;
}

void Solver_CVM::_Init()
{
	// count the distribution of data
	posIdx  = new int[prob->l];
	posNum	= 0;
	negIdx  = new int[prob->l];
	negNum	= 0;
	y       = new schar[prob->l];
	chklist = new char[prob->l];
	coreIdx = new int[prob->l];
	for(int i = 0; i < prob->l; i++)
	{	
		if (prob->y[i] > 0)
		{
			y[i]             = 1;
			posIdx[posNum++] = i;
		}
		else
		{
			y[i]             = -1;
			negIdx[negNum++] = i;
		}
		chklist[i] = 0;
		coreIdx[i] = -1;
	}

	// initialized the kernel
	outAlpha = &tmpAlpha[0];
	kernelQ  = new CVC_Q(prob, param, y);		
	Eta		 = kernelQ->get_Eta();	
	pNum     = posNum;
	nNum     = negNum;
	coreNum  = 0;

	// choose a small subset as initialization
	posTurn  = true;		
	for(int sampleNum = 0; sampleNum < INITIAL_CS; sampleNum++)
	{					
		posTurn = PosNeg(posTurn,pNum,nNum);
		int idx;
		do
		{
			// balanced and random sample
			int rand32bit = random();
			idx			  = posTurn ? posIdx[rand32bit%posNum] : negIdx[rand32bit%negNum];
		} while (chklist[idx] > 0);
		chklist[idx] = 1;
		if (y[idx] > 0)
			pNum--;
		else 
			nNum--;
		coreIdx[coreNum++]  = idx;
		outAlpha[sampleNum] = 1.0/INITIAL_CS;
		tempD[sampleNum]    = 0.0;
	}	
}

bool Solver_CVM::_Create(double cvm_eps)
{
	solver = new Solver_Lag(coreIdx,coreNum,*kernelQ,tempD,outAlpha,SMO_EPS,param->eps);
	return (solver != NULL);
}

double Solver_CVM::_maxDistFromSampling(double maxDistance2, int &maxDistance2Idx)
{
	double tmpdist = coreNorm2 + Eta;
	posTurn        = true;
	for(int sampleNum = 0; sampleNum < param->sample_size; sampleNum++)
	{					
		posTurn = PosNeg(posTurn,pNum,nNum);
		int idx;
		do
		{
			// balanced and random sample
			int rand32bit = random();
			idx			  = posTurn ? posIdx[rand32bit%posNum] : negIdx[rand32bit%negNum];
		} while (chklist[idx] > 0);
		double dist2 = kernelQ->dist2c_wc(idx, coreNum, coreIdx, outAlpha, tmpdist);
		if (dist2 > maxDistance2)
		{						
			maxDistance2 = dist2;
			maxDistance2Idx = idx;
		}					
	}
	return maxDistance2;
}

inline void Solver_CVM::_UpdateCoreSet(int maxDistance2Idx)
{
	if (y[maxDistance2Idx] > 0) 
		pNum--;
	else
		nNum--;

	// update center
	chklist[maxDistance2Idx] = 1;
	coreIdx[coreNum++]       = maxDistance2Idx;	
}	

double Solver_CVM::ComputeSolution(double *alpha, double Threshold)
{
	double bias      = 0.0;
	double sumAlpha  = 0.0;
	int i;
	for(i = 0; i < coreNum; i++)
	{
		if (outAlpha[i] > Threshold)
		{
			int ii    = coreIdx[i];
			alpha[ii] = outAlpha[i]*y[ii];
			bias     += alpha[ii];
			sumAlpha += outAlpha[i];
		}
	}
	bias /= sumAlpha;

	for(i = 0; i < coreNum; i++)
		alpha[coreIdx[i]] /= sumAlpha;
	return bias;
}

//---------------------------------------------------------------------------------------------------------------------

void Solver_CVR::_Init()
{
	// count the distribution of data		
	posIdx  = new int[prob->l];
	posNum  = 0;
	negIdx  = new int[prob->l];
	negNum  = 0;
	chklist = new char[prob->l];
	int i;
	for(i = 0; i < prob->l; i++)
	{	
		if (prob->y[i] > 0.0)
			posIdx[posNum++] = i;
		else
			negIdx[negNum++] = i;
		chklist[i] = 0;		
	}
	pNum    = posNum;
	nNum    = negNum;	
	numVar  = prob->l*2;
	coreIdx = new int[numVar];
	for(i = 0; i < numVar; i++)
		coreIdx[i] = -1;
	printf("begin to construct kernel!\n");
	
	// initialized the kernel
	outAlpha = &tmpAlpha[0];
	kernelQ  = new CVR_Q(prob, param);	
	QD       = kernelQ->get_QD();
	LinCoef  = kernelQ->get_LinCoef();	
	coreNum  = 0;

	// choose a small subset as initialization
	posTurn = true;		
	for(int sampleNum = 0; sampleNum < INITIAL_CS; sampleNum++)
	{					
		posTurn = PosNeg(posTurn,pNum,nNum);
		int idx;
		do
		{
			// balanced and random sample
			int rand32bit = random();
			idx			  = posTurn ? posIdx[rand32bit%posNum] : negIdx[rand32bit%negNum];
		} while (chklist[idx] > 0);
		chklist[idx] = 1;
		if (prob->y[idx] > 0.0)
			pNum--;
		else 
			nNum--;

		coreIdx[coreNum]    = idx;
		outAlpha[coreNum]   = 1.0/INITIAL_CS;
		tempD[coreNum]      = LinCoef[idx];
		coreIdx[coreNum+1]  = idx + prob->l;
		outAlpha[coreNum+1] = 0.0;
		tempD[coreNum+1]    = LinCoef[idx + prob->l];
		coreNum            += 2;
	}		
}

bool Solver_CVR::_Create(double cvm_eps)
{
	solver = new Solver_Lag(coreIdx,coreNum,*kernelQ,tempD,outAlpha,SMO_EPS,param->eps);
	return (solver != NULL);
}

double Solver_CVR::_maxDistFromSampling(double maxDistance2, int &maxDistance2Idx)
{	
	posTurn = true;
	for(int sampleNum = 0; sampleNum < param->sample_size; sampleNum++)
	{					
		posTurn = PosNeg(posTurn,pNum,nNum);
		int idx;
		do
		{
			// balanced and random sample
			int rand32bit = random();
			idx			  = posTurn ? posIdx[rand32bit%posNum] : negIdx[rand32bit%negNum];
		} while (chklist[idx] > 0);		
		double tmp   = 2.0 * kernelQ->dot_c_wc(idx, coreNum, coreIdx, outAlpha);
		double dist2 = max(coreNorm2-tmp+LinCoef[idx], coreNorm2+tmp+LinCoef[idx+prob->l]);
		if (dist2 > maxDistance2)
		{						
			maxDistance2    = dist2;
			maxDistance2Idx = idx;
		}		
	}
	return maxDistance2;
}

inline void Solver_CVR::_UpdateCoreSet(int maxDistance2Idx)
{	
	if (prob->y[maxDistance2Idx] > 0.0) 
		pNum--;
	else
		nNum--;

	// update center
	int maxDistance2Idx2     = maxDistance2Idx + prob->l;
	chklist[maxDistance2Idx] = 1;
	coreIdx[coreNum]         = maxDistance2Idx;	
	coreIdx[coreNum+1]       = maxDistance2Idx2;	
	coreNum                 += 2;
	tempD[0]                 = LinCoef[maxDistance2Idx];
	tempD[1]                 = LinCoef[maxDistance2Idx2];
}	

double Solver_CVR::ComputeSolution(double *alpha, double Threshold)
{	
	double bias      = 0.0;
	double sumAlpha  = 0.0;
	int i;
	for(i = 0; i < coreNum; i+=2)
	{
		int ii = coreIdx[i];
		if (outAlpha[i] > Threshold)		
			sumAlpha += outAlpha[i];
		else
			outAlpha[i] = 0.0;
		if (outAlpha[i+1] > Threshold)		
			sumAlpha += outAlpha[i+1];
		else
			outAlpha[i+1] = 0.0;
		double tmpAlpha = outAlpha[i] - outAlpha[i+1];
		alpha[ii] = tmpAlpha * param->C;
		bias += alpha[ii];
	}	

	bias /= sumAlpha;
	for(i = 0; i < coreNum; i+=2)
		alpha[coreIdx[i]] /= sumAlpha;

	return bias;
}


//---------------------------------------------------------------------------------------------------------------------

void solve_cvdd(
	const svm_problem *prob, const svm_parameter* param,
	double *alpha, Solver::SolutionInfo* si)
{
	// info
	info("num pattern = %ld\n", prob->l);
	
	// init		
	srandom(0);	
	for(int i = 0; i < prob->l; i++)
		alpha[i] = 0.0;

	// solve CVDD
	Solver_CVDD solver;
	solver.Init(prob,param);
	double cvm_eps = param->eps;
	if (cvm_eps <= 0.0)
		cvm_eps = (PREDICT_BND/(solver.GetKappa())+2.0/param->C/E_NUM_CV)/2.0/solver.GetEta();	
	printf("epsilon = %.8g\n",cvm_eps);
	bool flag = solver.Create(cvm_eps);	
	if (flag)
	{
		int coreNum = solver.Solve(param->num_basis,cvm_eps);

		// compute solution vector		
		double THRESHOLD = 1e-5/coreNum;
		double bias      = solver.ComputeSolution(alpha, THRESHOLD);	

		// info in CVDD
		si->obj    = solver.ComputeRadius2();
		si->rho    = si->obj;
		si->margin = solver.GetCoreNorm2();
	}
}

//---------------------------------------------------------------------------------------------------------------------

void solve_cvm(
	const svm_problem *prob, const svm_parameter* param,
	double *alpha, Solver::SolutionInfo* si, double Cp, double Cn)
{
	// info
	info("num pattern = %ld\n", prob->l);
	
	// init		
	srandom(0);	
	for(int i = 0; i < prob->l; i++)
		alpha[i] = 0.0;

	// solve CVM
	Solver_CVM solver;
	solver.Init(prob,param);
	double cvm_eps = param->eps;
	if (cvm_eps <= 0.0)
		cvm_eps = (PREDICT_BND/(solver.GetKappa())+2.0/param->C/E_NUM_CV)/2.0/solver.GetEta();	
	printf("epsilon = %.8g\n",cvm_eps);
	bool flag = solver.Create(cvm_eps);	
	if (flag)
	{
		int coreNum = solver.Solve(param->num_basis,cvm_eps);

		// compute solution vector		
		double THRESHOLD = 1e-5/coreNum;
		double bias      = solver.ComputeSolution(alpha, THRESHOLD);	
		double coreNorm2 = solver.GetCoreNorm2();

		// info in CVM		
		si->obj    = 0.5*coreNorm2;
		si->rho    = -bias;
		si->margin = coreNorm2;
	}
}

//---------------------------------------------------------------------------------------------------------------------

void solve_cvr(
	const svm_problem *prob, const svm_parameter* param,
	double *alpha, Solver::SolutionInfo* si)
{
	// info
	info("num pattern = %ld\n", prob->l);
	
	// init		
	srandom(0);	
	for(int i = 0; i < prob->l; i++)
		alpha[i] = 0.0;

	// solve CVR
	Solver_CVR solver;
	solver.Init(prob,param);
	double cvm_eps = param->eps;
	if (cvm_eps <= 0.0)
		cvm_eps = (PREDICT_BND/(solver.GetKappa())+2.0*param->mu*prob->l/param->C/E_NUM_CV)/2.0/solver.GetEta();	
	printf("epsilon = %.8g\n",cvm_eps);
	bool flag = solver.Create(cvm_eps);	
	if (flag)
	{
		int coreNum = solver.Solve(param->num_basis,cvm_eps);
		printf("finish the solver\n");

		// compute solution vector				
		double THRESHOLD = min(solver.GetEta()/param->C, 1e-5/coreNum);
		double bias      = solver.ComputeSolution(alpha, THRESHOLD);	

		// info in CVR
		si->obj    =  solver.ComputeRadius2() - solver.GetEta();
		si->rho    = -bias;
		si->margin =  solver.GetCoreNorm2();		
	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区x88av| 91浏览器打开| 亚洲一区二区综合| 国产欧美一区二区精品婷婷| 欧美日韩一区二区三区在线| 不卡的电影网站| 国产自产2019最新不卡| 日韩精品亚洲专区| 最新国产成人在线观看| 久久久久久久久伊人| 91精品国产综合久久国产大片| zzijzzij亚洲日本少妇熟睡| 国产一区二区在线观看视频| 丝袜美腿一区二区三区| 亚洲精品国产精华液| 欧美国产1区2区| 久久综合九色综合欧美98| 3atv在线一区二区三区| 在线区一区二视频| 99riav一区二区三区| 国产99久久久国产精品潘金| 久久国产三级精品| 日本麻豆一区二区三区视频| 亚洲成av人片| 亚洲va中文字幕| 亚洲一区二区美女| 亚洲最大的成人av| 有码一区二区三区| 亚洲免费资源在线播放| 国产精品沙发午睡系列990531| 精品成人在线观看| 精品福利一区二区三区| 日韩欧美一级片| 精品国产一二三| 精品福利视频一区二区三区| 久久亚洲影视婷婷| 国产色综合一区| 欧美激情一区二区三区全黄 | 久久蜜桃一区二区| 精品国产伦理网| 欧美精品一区二区三区四区| 久久久久久一级片| 国产欧美日韩视频在线观看| 久久久www免费人成精品| 国产欧美一区二区精品忘忧草 | 日韩亚洲电影在线| 日韩写真欧美这视频| 欧美va亚洲va香蕉在线| 国产日韩欧美电影| |精品福利一区二区三区| 亚洲综合偷拍欧美一区色| 亚洲bt欧美bt精品| 蜜桃久久久久久久| 国产乱人伦偷精品视频免下载| 丰满白嫩尤物一区二区| 99久久99久久久精品齐齐| 在线精品国精品国产尤物884a| 精品视频在线看| 日韩欧美高清dvd碟片| 久久嫩草精品久久久精品一| 国产精品乱人伦一区二区| 亚洲黄色小视频| 日本成人在线视频网站| 国产成人啪午夜精品网站男同| 99久久国产综合精品女不卡| 精品国产乱码久久久久久浪潮| 久久午夜老司机| 亚洲色图都市小说| 视频在线观看一区| 国产精品自拍在线| 91国产精品成人| 日韩免费高清av| 日韩毛片精品高清免费| 日韩经典一区二区| 成人一区二区三区在线观看| 欧美在线视频你懂得| 欧美精品一区二区高清在线观看| 亚洲欧美日韩综合aⅴ视频| 日韩国产欧美在线视频| 不卡av免费在线观看| 884aa四虎影成人精品一区| 国产午夜精品在线观看| 亚洲一区二区三区在线看| 国产精品自拍av| 欧美日韩的一区二区| 亚洲国产电影在线观看| 日韩不卡手机在线v区| 成人av资源站| 欧美电影免费观看高清完整版在线观看| 中文字幕亚洲区| 青青草97国产精品免费观看无弹窗版 | 中文成人综合网| 人人狠狠综合久久亚洲| 96av麻豆蜜桃一区二区| www国产成人免费观看视频 深夜成人网| 亚洲免费在线观看| 国产白丝精品91爽爽久久| 91精品久久久久久久91蜜桃| 亚洲乱码中文字幕综合| 国产成人精品一区二| 欧美一区永久视频免费观看| 亚洲视频在线一区二区| 国产不卡视频在线观看| 日韩欧美激情在线| 天堂在线亚洲视频| 一本色道久久综合亚洲精品按摩| 精品国产3级a| 日韩—二三区免费观看av| 日本久久精品电影| 中文字幕一区视频| 成人午夜私人影院| 欧美成人vps| 男女性色大片免费观看一区二区| 在线观看免费亚洲| 亚洲女爱视频在线| caoporn国产精品| 国产精品色哟哟| 成人小视频免费在线观看| 久久久精品一品道一区| 国内一区二区视频| 欧美大片拔萝卜| 青娱乐精品在线视频| 欧美高清hd18日本| 午夜精品福利一区二区三区av| 色婷婷久久久综合中文字幕| 最新久久zyz资源站| 97se亚洲国产综合在线| 成人欧美一区二区三区| 99精品久久只有精品| 中文字幕在线一区免费| 成人精品免费视频| 国产精品久久久久婷婷二区次| 国产馆精品极品| 国产精品久久久久影院老司| 国产成人av一区二区三区在线观看| 久久人人超碰精品| 福利一区二区在线观看| 亚洲国产精品成人综合色在线婷婷| 国产成人自拍在线| 欧美韩国一区二区| av在线不卡免费看| 亚洲日穴在线视频| 欧美三级日韩在线| 日日夜夜免费精品视频| 宅男在线国产精品| 美腿丝袜在线亚洲一区| 久久精品一二三| 成人福利在线看| 一级女性全黄久久生活片免费| 欧美三级乱人伦电影| 日本在线不卡视频| 欧美电影免费观看高清完整版| 韩国av一区二区三区四区| 国产精品麻豆一区二区| 色噜噜狠狠色综合欧洲selulu| 亚洲影院免费观看| 日韩亚洲电影在线| 成人毛片在线观看| 亚洲综合色在线| 日韩一卡二卡三卡国产欧美| 国产麻豆精品95视频| 成人免费一区二区三区视频 | 久久久亚洲午夜电影| 99久久精品费精品国产一区二区| 亚洲午夜国产一区99re久久| 精品入口麻豆88视频| 成人av在线一区二区| 视频在线观看一区| 国产欧美一区二区精品婷婷| 在线亚洲+欧美+日本专区| 久久精品国产亚洲一区二区三区| 国产精品二三区| 欧美一区二区三区四区五区 | 亚洲午夜一二三区视频| 日韩一区和二区| av一区二区久久| 麻豆极品一区二区三区| 中文字幕一区二区三区精华液 | 波多野结衣亚洲| 日韩av电影一区| 亚洲情趣在线观看| 欧美成人一区二区三区在线观看| av一区二区三区在线| 久久精品国产精品青草| 亚洲欧美另类久久久精品2019| 欧美一区二区视频观看视频| 99精品偷自拍| 国产做a爰片久久毛片| 亚洲综合在线免费观看| 久久久不卡影院| 56国语精品自产拍在线观看| 成人国产在线观看| 久久99久久久欧美国产| 亚洲与欧洲av电影| 国产精品欧美综合在线| 精品国产污网站| 欧美另类久久久品| 99久久精品国产一区| 国产伦精品一区二区三区视频青涩| 亚洲成在人线在线播放|