数据挖掘算法实现

学习了数据挖掘这门课,但是里面的算法仅仅是稍微了解了一下,并没有实现一下,试着把每个算法实现一下。。。。

1、决策树之ID3

下表记录了在不同气候条件下是否去打球的情况,要求根据该表用程序输出决策树。

Day Outlook Temperature Humidity Wind PlayTennis
1 Sunny Hot High Weak no
2 Sunny Hot High Strong no
3 Overcast Hot High Weak yes
4 Rainy Mild High Weak yes
5 Rainy Cool Normal Weak yes
6 Rainy Cool Normal Strong no
7 Overcast Cool Normal Strong yes
8 Sunny Mild High Weak no
9 Sunny Cool Normal Weak yes
10 Rainy Mild Normal Weak yes
11 Sunny Mild Normal Strong yes
12 Overcast Mild High Strong yes
13 Overcast Hot Normal Weak yes
14 Rainy Mild High Strong no
end

下面是ID3的部分程序,还没有写完,慢慢再补。

  1 #include <iostream>
  2 #include <string>
  3 #include <cstring>
  4 #include <vector>
  5 #include <list>
  6 #include <map>
  7 #include <algorithm>
  8 #include <cstdlib>
  9 #include <cstdio>
 10 #include <cmath>
 11
 12 using namespace std;
 13
 14 class Node
 15 {
 16 public:
 17     vector<int> next;
 18     string attr;
 19     string ans;
 20     //Node() next(), attr(""), ans(""){}
 21 };
 22
 23 const string yes = "yes";
 24 const string no = "no";
 25 const int attribute_name_size = 6;
 26 vector< vector<string> > data; //day weather temperature humidity wind play_or_not
 27 Node node[1000];
 28 int cnt_of_node = 0;
 29
 30 void input()
 31 {
 32     string str;
 33     vector<string> tmp;
 34     while (cin >> str && str != "end")
 35     {
 36         tmp.push_back(str);
 37         for (int i = 0; i < attribute_name_size-1; ++i)
 38         {
 39             cin >> str;
 40             tmp.push_back(str);
 41         }
 42         data.push_back(tmp);
 43         tmp.clear();
 44     }
 45 }
 46
 47 double calcEntropy(vector<vector<string> >& vec, string element)
 48 {
 49     double ans = 0;
 50     map<string, int> mp;
 51     if (vec.size() <= 0) return -1;
 52     for (int j = 0; j < vec[0].size(); ++j)
 53     {
 54         if (vec[0][j] == element)
 55             for (int i = 1; i < vec.size(); ++i)
 56                 mp[vec[i][j]]++;
 57     }
 58     double cnt = vec.size()-1;
 59     for (map<string, int>::iterator it = mp.begin(); it != mp.end(); ++it)
 60     {
 61         double p = (it->second)/cnt;
 62         ans -= p*log2(p);
 63     }
 64     return ans;
 65 }
 66
 67 double calcInfo(vector<vector<string> >& vec, int idx)
 68 {
 69     double ans = 0;
 70     if (vec.size() <= 1) return -1;
 71     map<string, map<string, int> > mp;
 72     int len = vec[0].size();
 73     int size = vec.size()-1;
 74
 75     for (int j = 1; j < vec.size(); ++j)
 76         mp[vec[j][idx]][vec[j][len-1]]++;
 77     for (map<string, map<string, int> >::iterator it = mp.begin(); it != mp.end(); ++it)
 78     {
 79         int ys = 0, nt = 0;
 80         for (map<string, int>::iterator itr = (it->second).begin(); itr != (it->second).end(); ++itr)
 81         {
 82             if (itr->first == yes) ys += itr->second;
 83             if (itr->first == no) nt += itr->second;
 84         }
 85         ans = -(ys+nt)/size*(-ys/(ys+nt)*log2(ys/(ys+nt)) - nt/(ys+nt)*log2(nt/(ys+nt)));
 86     }
 87     return ans;
 88 }
 89
 90 int findBestAttribute(vector<vector<string> >& tmp)
 91 {
 92     if (tmp.size() <= 1) return -1;
 93     int len = tmp[0].size();
 94     string result = tmp[0][len-1];
 95     vector<double> v;
 96     double info_result = calcEntropy(tmp, result);
 97     for (int i = 0; i < len; ++i)
 98         v.push_back(calcInfo(tmp, i));
 99     double max_info_gain = 0;
100     int idx = 0;
101     for (int i = 0; i < v.size(); ++i)
102     {
103         if (info_result-v[i] > max_info_gain)
104             max_info_gain = info_result-v[idx=i];
105     }
106     return idx;
107 }
108
109 void work(vector< vector<string> >& source, int now_node_num)
110 {
111     int idx = 0;
112     idx = findBestAttribute(source);
113     vector<int> vis(source.size(), 0);
114     vector<string> attribute_tmp;
115     for (int i = 0; i < source[0].size(); ++i)
116         if (i != idx) attribute_tmp.push_back(source[0][i]);
117     int len = source[0].size();
118     for (int i = 1; i < source.size(); ++i)
119     {
120         if (vis[i]) continue;
121         map<string, int> mp;
122         for (int j = i; j < source.size(); ++j)
123         {
124             if (source[j][idx] == source[i][idx])
125             {
126                 mp[source[j][len-1]]++;
127                 vis[j] = 1;
128             }
129         }
130         node[now_node_num].next.push_back(++cnt_of_node);
131         node[cnt_of_node].attr = source[i][idx];
132         if (mp.size() == 1)
133         {
134             node[cnt_of_node].ans = source[i][len-1];
135             node[cnt_of_node].next.clear();
136         }
137         else
138         {
139             vector<vector<string> > vs;
140             for (int j = 0; j < source.size(); ++j)
141             {
142                 vector<string> tmp;
143                 for (int k = 0; k < source[0].size(); ++k)
144                 {
145                     if (k == idx) continue;
146                     tmp.push_back(source[j][k]);
147                 }
148                 vs.push_back(tmp);
149             }
150             work(vs, cnt_of_node);
151         }
152     }
153 }
154
155 void outputSourceData()
156 {
157     for (int i = 0; i < data.size(); ++i)
158     {
159         for (int j = 0; j < data[i].size(); ++j)
160             cout << data[i][j] << ‘\t‘;
161         cout << endl;
162     }
163 }
164
165 int main()
166 {
167
168     return 0;
169 }

ID3

时间: 2024-10-12 13:42:50

数据挖掘算法实现的相关文章

数据挖掘算法学习(三)NaiveBayes算法

算法简单介绍 NBC是应用最广的分类算法之中的一个.朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率.同一时候,NBC模型所需预计的參数非常少,对缺失数据不太敏感,算法也比較简单. 算法如果 给定目标值时属性之间互相条件独立. 算法输入 训练数据   T={(x1,y1),(x2,y2),--,(xn,yn)} 待分类数据x0=(x0(1),x0(2),--,x0(n))T 算法输出 待分类数据x0的分类结果y0∈{c1,c2,--,ck} 算法思想 weka执行 以we

数据挖掘算法学习(一)K-Means算法

博主最近实习开始接触数据挖掘,将学习笔记分享给大家.目前用的软件是weka,下篇文章会着重讲解. 算法简介: K-Means算法是输入聚类个数k,以及包含n个数据对象的数据库,输出满足方差最小标准的k个聚类.并使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类对象相似度较小. 算法假设: 均方误差是计算群组分散度的最佳参数. 算法输入: 聚类个数k:包含n个数据对象的数据集. 算法输出: k个聚类 算法思想: (a)绿点表示数据集在二级的欧几里德空间,初始化的中心点u1和u2用红的和蓝

数据挖掘算法之k-means算法

系列文章:数据挖掘算法之决策树算法 [QQ群: 189191838,对算法和C++感兴趣可以进来]       k-means算法可以说是数据挖掘中十大经典算法之一了,属于无监督的学习.该算法由此衍生出了很多类k-means算法,比如k中心点等等,在数据挖掘领域,很多地方都会用到该算法,他能够把相似的一类很好的聚在一起.一类指的是,他们之间的相似度较高,计算相似度的常用度量有欧氏距离.余弦定理等.本算法采用的是欧式距离度量.这个对理解k-means算法不会造成任何实质性的影响. 为了更好的说明k

微软数据挖掘算法:结果预测篇

本文原文地址:(原创)大数据时代:基于微软案例数据库数据挖掘知识点总结(结果预测篇) 前言 本篇文章主要是继续前几篇微软数据挖掘算法:Microsoft 决策树分析算法(1).微软数据挖掘算法:Microsoft 聚类分析算法(2).微软数据挖掘算法:Microsoft Naive Bayes 算法(3),算法介绍后,经过这几种算法综合挖掘和分析之后,对一份摆在公司面前的人员信息列表进行推测,挖掘出这些人员信息中可能购买自行车的群体,把他们交个营销部,剩下的事就是他们无情的对这群团体骚扰.推荐.

十大经典数据挖掘算法

国际权威学术组织the IEEE International Conference on Data Mining (ICDM) 2006年12本月十大评选经典的数据挖掘算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART. 不不过选中的十大算法.事实上參加评选的18种算法,实际上随便拿出一种来都能够称得上是经典算法,它们在数据挖掘领域都产生了极为深远的影响. 1. C4.5 C4.5算

数据挖掘算法之-关联规则挖掘(Association Rule)(购物篮分析)

在各种数据挖掘算法中,关联规则挖掘算是比较重要的一种,尤其是受购物篮分析的影响,关联规则被应用到很多实际业务中,本文对关联规则挖掘做一个小的总结. 首先,和聚类算法一样,关联规则挖掘属于无监督学习方法,它描述的是在一个事物中物品间同时出现的规律的知识模式,现实生活中,比如超市购物时,顾客购买记录常常隐含着很多关联规则,比如购买圆珠笔的顾客中有65%也购买了笔记本,利用这些规则,商场人员可以很好的规划商品摆放问题: 为叙述方便,设R= { I1,I2 ......Im} 是一组物品集,W 是一组事

18大经典数据挖掘算法小结

18大经典数据挖掘算法小结 本文所有涉及到的数据挖掘代码的都放在了我的github上了. 地址链接: https://github.com/linyiqun/DataMiningAlgorithm 大概花了将近2个月的时间,自己把18大数据挖掘的经典算法进行了学习并且进行了代码实现,涉及到了决策分类,聚类,链接挖掘,关联挖掘,模式挖掘等等方面.也算是对数据挖掘领域的小小入门了吧.下面就做个小小的总结,后面都是我自己相应算法的博文链接,希望能够帮助大家学习. 1.C4.5算法.C4.5算法与ID3

数据挖掘算法Analysis Services-基于SQL Server的数据挖掘

数据挖掘算法(Analysis Services – 数据挖掘) data mining algorithm is a set of heuristics and calculations that creates a data mining model from data.” xml:space=”preserve”>“数据挖掘算法”是根据数据创建数据挖掘模型的一组试探法和计算. 为了创建模型,算法将首先分析您提供的数据,并查找特定类型的模式和趋势. 算法使用此分析的结果来定义用于创建挖掘模型

数据挖掘算法之深入朴素贝叶斯分类

写在前面的话: 我现在大四,毕业设计是做一个基于大数据的用户画像研究分析.所以开始学习数据挖掘的相关技术.这是我学习的一个新技术领域,学习难度比我以往学过的所有技术都难.虽然现在在一家公司实习,但是工作还是挺忙的,经常要加班,无论工作多忙,还是决定要写一个专栏,这个专栏就写一些数据挖掘算法.数据结构.算法设计和分析的相关文章.通过写博文来督促自己不断学习.以前对于数学没有多大的兴趣爱好,从小到大,学数学也是为了考试能考个好的成绩,学过的很多数学知识,并没有深刻的感受到它的用途,不用也就慢慢遗忘,

微软数据挖掘算法:Microsoft 关联规则分析算法(7)

前言 本篇继续我们的微软挖掘算法系列总结,前几篇我们分别介绍了:微软数据挖掘算法:Microsoft 决策树分析算法(1).微软数据挖掘算法:Microsoft 聚类分析算法(2).微软数据挖掘算法:Microsoft Naive Bayes 算法(3).微软数据挖掘算法:Microsoft 时序算法(5),后续还补充了二篇微软数据挖掘算法:结果预测篇(4).微软数据挖掘算法:Microsoft 时序算法之结果预测及其彩票预测(6),看样子有必要整理一篇目录了,不同的算法应用的场景也是不同的,每