从数据库读取数据训练神经网络

由于数据列太多(504列),无法加载到txt和excel中,而且操作起来不方便,因此这里直接从数据库中加载数据

另外,对于数据库中一些连接和操作的语句,这里也记录下来,以后用起来方便些。就不用去代码中找了。

1、连接数据库

在此之前,需要用odbc配置数据源,建立数据库,配置数据源即可。


CDataBase* m_pDataBase; //定义
m_pDataBase=new CDatabase(); //构造函数中
m_pDataBase->Close();//析构函数中
<span style="white-space:pre">	</span>delete m_pDataBase;
#include "afxdb.h"  --数据库头文件不要忘记
BOOL CChangeIdeaApp::PrepareDataBase()
{	

	BOOL bRet;
	TRY
	{
		bRet=m_pDataBase->Open(NULL,FALSE,FALSE,_T("ODBC;DSN=ZKDB"));//;UID=sa;PWD=psdmaes
	}
	CATCH_ALL(e)
	{
		char MsgError[255];
		e->GetErrorMessage(MsgError,255);
		AfxMessageBox(MsgError);
		delete m_pDataBase;
		return FALSE;
	}
	END_CATCH_ALL
	if(!bRet)
	{
		AfxMessageBox(_T("连接失败!"));
        delete m_pDataBase;
		return FALSE;
	}
}
这个例子是以前做的一个利用字库做idea的,这里重新拿出来

2、读取数据

这里是一个读取字库中记录的小程序,这里有一些随机读取的功能,可以用来做一般的模板使用

int row=GetProfileInt("字库","行数",2358);
	int col=GetProfileInt("字库","列数",10);

	
	CString OutContent="";
	srand((int)time(0));
	for(int i=0;i<4;i++)
	{	
		int r=rand()%row;//随机取行和列
		int c=rand()%col;
		char GetName[100];
		SDWORD cbName;
		c++;
		c++;
		char ss[1024];
		HSTMT hStmt;
		RETCODE retcode;
		sprintf(ss,"select * from ZkTable where ROW=%d",r);
		if(SQLAllocStmt(m_pDataBase->m_hdbc,&hStmt)!=SQL_SUCCESS) 
		{
			AfxMessageBox("SQLAllocStmt error !",MB_OK);
			return FALSE;
		}
		retcode = SQLExecDirect(hStmt, (unsigned char *)ss, SQL_NTS); 
		if((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) 
		{
			SQLFreeStmt(hStmt,SQL_DROP);
			AfxMessageBox("SQLExecDirect Error",MB_OK);
			return FALSE;
		}
		while(retcode==SQL_SUCCESS)
		{ 
			retcode = SQLFetch(hStmt); 
			if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
			{
				SQLGetData(hStmt, c, SQL_C_CHAR, &GetName[0], 256, &cbName); //c为第c列,从1开始,一些其他的格式见下表1
				OutContent+=GetName;
				break;
			}
			
		}
		SQLFreeStmt(hStmt,SQL_DROP);


	}

RecordContent=OutContent;	

 

经过改进,完整的从数据库中读取数据成为矩阵的代码如下

功能:从数据库中读取50行数据,共504列到矩阵中。

对于这种矩阵类,我觉得还是很好用的,我应该掌握它。并让它成为自己的程序。

bool CMatrix::LoadDataFromBase()
{
	CNNBPApp* pApp = (CNNBPApp*)AfxGetApp();
	//设置矩阵的行列
	m_nRow =50;
	SetMatrixRowNumber(m_nRow);
	m_nCol =504;
	SetMatrixColNumber(m_nCol);

	double GetValue;
	SDWORD cbName;
	char ss[1024];
	CString OutContent="";
	HSTMT hStmt;
	RETCODE retcode;
	sprintf(ss,"select * from aatest");
	if(SQLAllocStmt(pApp->m_pDataBase->m_hdbc,&hStmt)!=SQL_SUCCESS) 
	{
		AfxMessageBox("SQLAllocStmt error !",MB_OK);
		return FALSE;
	}
	retcode = SQLExecDirect(hStmt, (unsigned char *)ss, SQL_NTS); 
	if((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) 
	{
		SQLFreeStmt(hStmt,SQL_DROP);
		AfxMessageBox("SQLExecDirect Error",MB_OK);
		return FALSE;
	}
	int i=0;
	while(retcode==SQL_SUCCESS)
	{ 
		retcode = SQLFetch(hStmt); 
		if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
		{
			for(int j=1;j<=504;j++)
			{	
				SQLGetData(hStmt, j, SQL_C_DOUBLE, &GetValue, 256, &cbName); 	
				m_pTMatrix [i][j-1] = GetValue;
			}

		}
		i++;
		if(i>=50)
			break;
		
	}
	SQLFreeStmt(hStmt,SQL_DROP);
	
}

这里贴出来,以后找起来就方便了。

表1 格式大全来源http://www.cnblogs.com/zhenjing/ 

SQL类型

C类型

bit

SQL_BIT

SQL_C_BIT

tinyint

SQL_TINYINT

SQL_C_STINYINT

tinyint unsigned

SQL_TINYINT

SQL_C_UTINYINT

bigint

SQL_BIGINT

SQL_C_SBIGINT

bigint unsigned

SQL_BIGINT

SQL_C_UBIGINT

long varbinary

SQL_LONGVARBINARY

SQL_C_BINARY

blob

SQL_LONGVARBINARY

SQL_C_BINARY

longblob

SQL_LONGVARBINARY

SQL_C_BINARY

tinyblob

SQL_LONGVARBINARY

SQL_C_BINARY

mediumblob

SQL_LONGVARBINARY

SQL_C_BINARY

long varchar

SQL_LONGVARCHAR

SQL_C_CHAR

text

SQL_LONGVARCHAR

SQL_C_CHAR

mediumtext

SQL_LONGVARCHAR

SQL_C_CHAR

char

SQL_CHAR

SQL_C_CHAR

numeric

SQL_NUMERIC

SQL_C_CHAR

decimal

SQL_DECIMAL

SQL_C_CHAR

integer

SQL_INTEGER

SQL_C_SLONG

integer unsigned

SQL_INTEGER

SQL_C_ULONG

int

SQL_INTEGER

SQL_C_SLONG

int unsigned

SQL_INTEGER

SQL_C_ULONG

mediumint

SQL_INTEGER

SQL_C_SLONG

mediumint unsigned

SQL_INTEGER

SQL_C_ULONG

smallint

SQL_SMALLINT

SQL_C_SSHORT

smallint unsigned

SQL_SMALLINT

SQL_C_USHORT

real

SQL_FLOAT

SQL_C_DOUBLE

double

SQL_FLOAT

SQL_C_DOUBLE

float

SQL_REAL

SQL_C_FLOAT

double precision

SQL_DOUBLE

SQL_C_DOUBLE

date

SQL_DATE

SQL_C_DATE

time

SQL_TIME

SQL_C_TIME

year

SQL_SMALLINT

SQL_C_SHORT

datetime

SQL_TIMESTAMP

SQL_C_TIMESTAMP

timestamp

SQL_TIMESTAMP

SQL_C_TIMESTAMP

text

SQL_VARCHAR

SQL_C_CHAR

varchar

SQL_VARCHAR

SQL_C_CHAR

enum

SQL_VARCHAR

SQL_C_CHAR

set

SQL_VARCHAR

SQL_C_CHAR

bit

SQL_CHAR

SQL_C_CHAR

bool

SQL_CHAR

SQL_C_CHAR


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的Python代码,用于训练基于Keras的RNN神经网络,以预测3个参数: ```python import numpy as np import pandas as pd from keras.models import Sequential from keras.layers import Dense, LSTM # 读取数据文件 data = pd.read_csv("data.csv") # 将数据划分为训练集和测试集 train_data = data.sample(frac=0.8, random_state=0) test_data = data.drop(train_data.index) # 将训练数据和测试数据转换为numpy数组 train_input = train_data.iloc[:, :-3].values train_output = train_data.iloc[:, -3:].values test_input = test_data.iloc[:, :-3].values test_output = test_data.iloc[:, -3:].values # 将输入数据规范化为0到1之间的值 max_input = np.amax(train_input, axis=0) max_output = np.amax(train_output, axis=0) train_input = train_input / max_input train_output = train_output / max_output test_input = test_input / max_input test_output = test_output / max_output # 定义模型 model = Sequential() model.add(LSTM(100, input_shape=(train_input.shape[1], 1))) model.add(Dense(3)) # 编译模型 model.compile(loss='mean_squared_error', optimizer='adam') # 训练模型 model.fit(train_input.reshape((train_input.shape[0], train_input.shape[1], 1)), train_output, epochs=100, batch_size=10, verbose=2) # 评估模型 test_loss = model.evaluate(test_input.reshape((test_input.shape[0], test_input.shape[1], 1)), test_output, verbose=0) print("Test loss:", test_loss) ``` 在上面的代码中,我们首先读包含20个参数的数据表,并将其划分为训练集和测试集。然后,我们将输入数据规范化为0到1之间的值,并定义一个包含一个LSTM层和一个密集层的神经网络模型。最后,我们使用训练训练模型,并使用测试集评估模型的性能。 需要注意的是,由于我们的输入数据是一个20个参数的向量,因此我们需要将其转换为一个形状为(样本数,时间步,特征数)的3D张量,其中时间步被设置为1,特征数被设置为20。这可以通过使用reshape函数轻松完成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值