机器学习——归纳学习

  • 概念
    从多个具体的事实出发,很好的说明这些知识的学习。

  • 股票的预测(归纳学习的实现方法)
    学习数据:十个公司股价对此公司股价的影响,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此次,分数更高,也更为准确。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖玖玖_violet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值