-
概念
从多个具体的事实出发,很好的说明这些知识的学习。 -
股票的预测(归纳学习的实现方法)
学习数据:十个公司股价对此公司股价的影响,1上升,0下降.
教师数据:此公司的股票上升或下降.
基于生成和测试的方法求得模式:采用某种方法生成问题的候补解,本例中就是生成随机的学习数据 教师数据,eg.0 0 1 0 1 1 0 1 0 1 1 ,将之与问题的条件对照起来选取良好的解。然后与学习数据进行比较,执行选取更好解的操作。候选解在其中有几个模式是正确的,基于正确率可以评价。某个模式在100个例子中都能正确处理,评价分数是100,反之如果全部不正确就是0分。
正确预测的得分加1,否则减1。
首先输入100组学习数据 教师数据,eg.0 0 1 0 1 1 0 1 0 1 1
然后通过归纳学习,得到最优解的模式eg.2 2 1 2 2 0 2 1 2 0(2代表是1或0都可以)。
// 股票预测.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define OK 1
#define NG 0
#define SETSIZE 100 // 学习数据集的大小
#define CNO 10 //学习数据的位数
#define GENMAX 10000 //生成候选解的次数
#define SEED 32767 //随机数的种子
int i, j;
int score = 0;//得分
int answer[CNO];//候选解
int teacher[SETSIZE];//教师数据
int bestscore = 0;//得分最优解
int bestanswer[CNO];//搜索过程中的最优解
void readdata(int data[SETSIZE][CNO],int teacher[SETSIZE]);
int rand012();//返回0,1,2的随机函数
int calcscore(int data[SETSIZE][CNO],int teacher[SETSIZE],int answer[CNO]);//计算候选解模式的得分
int main()
{
int data[SETSIZE][CNO];//学习数据集
readdata(data,teacher);
srand(SEED);//随机数组的初始化
//double a[1000];
//int b = 0;
//for (int i = 0; i < 1000; i++) {
// a[i] = rand012();
// cout << a[i] << " ";
//
// if (((i + 1) % 10) == 0)
// //int b = rand012();
// cout << endl;
//
//}
/*随机函数的测试
double a[30];
for (int i = 0; i < 30; i++) {
a[i] = rand012();
cout << a[i] << " ";
}*/
/*测试学习数据的数组
for (i = 0; i < SETSIZE; ++i) {
for (j = 0; j < CNO; ++j) {
cout << data[i][j] << " ";
}
cout << " " << teacher[i] << endl;
}*/
for (i = 0; i < GENMAX; ++i) {
//生成候选解
for (j = 0; j < CNO; ++j) {
answer[j] = rand012();
}
//检查
score = calcscore(data, teacher, answer);
if((i%73) == 0)
//最优解的更新
if (score > bestscore) {
for (j = 0; j < CNO; ++j) {
bestanswer[j] = answer[j];
}
bestscore = score;
for (j = 0; j < CNO; ++j) {
printf_s("%1d", bestanswer[j]);
}
printf_s(":score=%d\n", bestscore);
}
}
cout << "\n最优解:\n";
for (j = 0; j < CNO; ++j) {
cout << bestanswer[j] << " ";
}
cout << bestscore;
}
void readdata(int data[SETSIZE][CNO],int teacher[SETSIZE])
{
int i, j;
for (i = 0; i < SETSIZE; ++i) {
for (j = 0; j < CNO; ++j) {
scanf_s("%d", &data[i][j]);
}
scanf_s("%d", &teacher[i]);
}
}
int rand012() {
int rnd;
//rnd = rand();
while ((rnd = rand()) == RAND_MAX);//去除随机数的最大值 此处有疑问
return (double)rnd / RAND_MAX * 3;//计算随机数
}
int calcscore(int data[SETSIZE][CNO], int teacher[SETSIZE], int answer[CNO]) {
int score = 0;//得分
int point;//相一致的位数
//计算一致程度
for (int i = 0; i < SETSIZE; ++i) {
point = 0;
for (int j = 0; j < CNO; ++j) {
if (answer[j] == 2)
++point;//通配符
else if (answer[j] == data[i][j])//相一致
++point;
}
if ((point == CNO) && (teacher[i] == 1)) {
++score;
}
else if ((point != CNO) && (teacher[i] == 0)) {
++score;
}
}
return score;
}
测试结果:
可以看出
- 测试代码
// 测试.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
using namespace std;
const int SETSIZE = 100;
const int CNO = 10;
void readdata(int data[SETSIZE][CNO], int teacher[SETSIZE]);
int main(){
int data[SETSIZE][CNO];
int teacher[SETSIZE];
int cnt = 0;
int i, j;
int test[10];
readdata(data, teacher);
cout << "当0~8分别为0,9为0,测试股价上涨的次数:";
for (j = 0; j <= 8; j++) {
for (i = 0; i < SETSIZE; ++i) {
if (data[i][j] == 0 && data[i][9] == 0 && teacher[i] == 1)
cnt++;
}
test[j] = cnt;
cout << test[j] << " ";
cnt = 0;
}
cnt = 0;
cout << "\n\n当0~7分别为0,8为0,测试股价上涨的次数:";
for (j = 0; j <= 7; j++) {
for (i = 0; i < SETSIZE; ++i) {
if (data[i][j] == 0 && data[i][8] == 0 && teacher[i] == 1)
cnt++;
}
test[j] = cnt;
cout << test[j] << " ";
cnt = 0;
}
cnt = 0;
cout << "\n\n当0~6分别为0,7为0,测试股价上涨的次数:";
for (j = 0; j <= 6; j++) {
for (i = 0; i < SETSIZE; ++i) {
if (data[i][j] == 0 && data[i][7] == 0 && teacher[i] == 1)
cnt++;
}
test[j] = cnt;
cout << test[j] << " ";
cnt = 0;
}
cnt = 0;
cout << "\n\n当0为0,为1~9,测试股价上涨的次数:";
for (j = 9; j >= 0; j--) {
for (i = 0; i < SETSIZE; ++i) {
if (data[i][0] == 0 && data[i][j] == 0 && teacher[i] == 1)
cnt++;
}
test[j] = cnt;
cout << test[j] << " ";
cnt = 0;
}
cnt = 0;
cout << "\n\n当1为0,为2~9,测试股价上涨的次数:";
for (j = 9; j >= 2; j--) {
for (i = 0; i < SETSIZE; ++i) {
if (data[i][1] == 0 && data[i][j] == 0 && teacher[i] == 1)
cnt++;
}
test[j] = cnt;
cout << test[j] << " ";
cnt = 0;
}
cnt = 0;
cout << "\n\n当2为0,为3~9,测试股价上涨的次数:";
for (j = 9; j >= 3; j--) {
for (i = 0; i < SETSIZE; ++i) {
if (data[i][2] == 0 && data[i][j] == 0 && teacher[i] == 1)
cnt++;
}
test[j] = cnt;
cout << test[j] << " ";
cnt = 0;
}
return 0;
}
void readdata(int data[SETSIZE][CNO], int teacher[SETSIZE])
{
int i, j;
for (i = 0; i < SETSIZE; ++i) {
for (j = 0; j < CNO; ++j) {
scanf_s("%d", &data[i][j]);
}
scanf_s("%d", &teacher[i]);
}
}
测试结果:
- 当增加了候选解的次数后,测试模式更加完善,给出了较之前更好的模式
#define GENMAX 100000
//生成候选解的次数
再次测试,为31此次,分数更高,也更为准确。