MachineABC* LeastSquareTrainer::Train(DataSet* pData)
{
	LeastSquareMachine* pMachine=new LeastSquareMachine;

	Matd* m_pmData=new Matd((double**)pData->m_pprData, pData->m_nCount, pData->m_nDim);
	Vecd* m_pvObj=new Vecd((double*)pData->m_prCls, pData->m_nCount);
	
	Mat mB(m_pmData->Cols(), m_pmData->Cols(), MAT_Tdouble);
	MatOp::TrAA(&mB, m_pmData);
	mB.Invert();
		
	Mat mTemp(m_pmData->Cols(), m_pmData->Rows(), MAT_Tdouble);
	Mat mTr(m_pmData->Cols(), m_pmData->Rows(), MAT_Tdouble);
	MatOp::Transpose (&mTr, m_pmData);
	MatOp::Mul(&mTemp, &mB, &mTr);
	
	pMachine->m_vCoeff.Create (m_pmData->Cols(), MAT_Tfloat);
	Vec vRet(m_pmData->Cols(), MAT_Tdouble);
	MatOp::Mul(&vRet, &mTemp, m_pvObj);
	for (int i = 0; i < vRet.Length(); i ++)
		pMachine->m_vCoeff.data.fl[i] = (float)vRet.data.db[i];
	delete m_pmData;
	delete m_pvObj;
	return pMachine;
}
Esempio n. 2
0
// Scalar operatations
XINDEX_VECTOR XINDEX_VECTOR::operator -(void)  const
{
	XINDEX_VECTOR	vRet(m_uiN);
	for (unsigned int uiI = 0; uiI < m_uiN; uiI++)
	{
		vRet.m_lpuiValues[uiI] = -m_lpuiValues[uiI];
	}
	return vRet;
}
Variable FunctionTargets::call( Variable &/*input*/, VarList lParams )
{
    Variable vRet( Variable::typeList );
    TargetList lTrg;
    if( lParams.getSize() == 0 )
    {
        lTrg = pContext->getExplicitTargets();
    }
    else
    {
        lTrg = pContext->getTag( lParams.first().toString() );
    }
    for( TargetList::const_iterator i = lTrg.begin(); i; i++ )
    {
        for( StrList::const_iterator j = (*i)->getOutputList().begin(); j; j++ )
        {
            vRet.append( *j );
        }
    }
    return vRet;
}
int	LinearRegressorTrainer::Train (ClassifierABC* pMachine)
{
	LinearRegressor* pRegressor = (LinearRegressor*)pMachine;

	int i;

	Mat mB(m_pmData->Cols(), m_pmData->Cols(), MAT_Tdouble);
	MatOp::TrAA(&mB, m_pmData);
	LUDecomposition lu(&mB);
	
	Mat mI(m_pmData->Cols(), m_pmData->Cols(), MAT_Tdouble);
	mI.Zero();
	for (i = 0; i < mI.Rows(); i ++)
		mI.data.db[i][i] = 1.0;
	Mat* pmInverse = lu.Solve (&mI);
	if (pmInverse==0)
		return 0;
	
	Mat mTemp(m_pmData->Cols(), m_pmData->Rows(), MAT_Tdouble);
	Mat mTr(m_pmData->Cols(), m_pmData->Rows(), MAT_Tdouble);
	MatOp::Transpose (&mTr, m_pmData);
	MatOp::Mul(&mTemp, pmInverse, &mTr);

	pRegressor->m_vCoeff.Create (m_pmData->Cols(), MAT_Tfloat);
	Vec vRet(m_pmData->Cols(), MAT_Tdouble);
	MatOp::Mul(&vRet, &mTemp, m_pvObj);
	for (i = 0; i < vRet.Length(); i ++)
		pRegressor->m_vCoeff.data.fl[i] = (float)vRet.data.db[i];
	
	ReleaseMat(pmInverse);
	mTemp.Release();
	mTr.Release();
	mI.Release();
	mB.Release();

	return 1;
}
inline Vector3T<T> operator*(const T dScale, const Vector3T<T>& vec) throw()
{
   Vector3T<T> vRet(vec);
   vRet *= dScale;
   return vRet;
}