支持向量机(SVM)代码

4.处理数据集

  • 划分数据集代码
def split_data_set(data_set,axis,value):
    """
    ID3算法需要对每个特征计算信息增益,选取最大的,这里就是对特征进行切分,
    传入每一列的索引,和值进行切分,返回的值不包括当前的这一个特征列。
    
    :param axis: 特征对应的 列名索引  [0,1,2,3]
    :param value: 特征值[id,color,root]对应列名里面所取的值,例如对color特征
                  进行切分传入value=dark_green,value=light_white,不同特征返回不同的列表
                  计算香浓熵
    :return: 
    """
    # 例如传入(data_set,1,dark_green),返回包含特征等于dark_green的列表
    ret_data_set = []
    for featVec in data_set:    # feat   合适的

        if featVec[axis] ==value:
            reduced_featVec = featVec[:axis]  # 0:0 的切片是一个[]

            reduce_eatVec_list = list(reduced_featVec)

            reduce_eatVec_list.extend(featVec[axis+1:])

            ret_data_set.append(reduce_eatVec_list)
    return ret_data_set


  
  • 选择最好的特征
def choose_best_feature_to_split(data_set):
    "选择最好的特征"
    num_features =len(data_set[0])-1  # 统计有几个特征
    base_Entropy = calculation_Shannon_Ent(data_set)
    best_info_gain = 0.0
    best_feature =-1

    # unique 独特的,唯一的
    for i in range(num_features):
        feat_list = [example[i] for example in data_set]
        unique_values = set(feat_list)  # 统计每个特征,有几个值
        new_Entropy = 0.0

        for value in unique_values:
            sub_data_set =split_data_set(data_set,i,value)  # 特征里面不同的值进行切分数据
            prob =len(sub_data_set)/float(len(data_set))
            # 计算每个不同值的熵,再乘以概率 H(D|A)
            new_Entropy += prob * calculation_Shannon_Ent(sub_data_set)#
        # 就是信息增益H(D)-H(D|A)
        info_gain = base_Entropy -new_Entropy
        if info_gain >best_info_gain:
            best_info_gain = info_gain
            best_feature =i
    return best_feature
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <math.h> #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <float.h> #include <string.h> #include <stdarg.h> #include <limits.h> #include <locale.h> #include "svm.h" int libsvm_version = LIBSVM_VERSION; typedef float Qfloat; typedef signed char schar; #ifndef min template <class T> static inline T min(T x,T y) { return (x<y)?x:y; } #endif #ifndef max template <class T> static inline T max(T x,T y) { return (x>y)?x:y; } #endif template <class T> static inline void swap(T& x, T& y) { T t=x; x=y; y=t; } template <class S, class T> static inline void clone(T*& dst, S* src, int n) { dst = new T[n]; memcpy((void *)dst,(void *)src,sizeof(T)*n); } static inline double powi(double base, int times) { double tmp = base, ret = 1.0; for(int t=times; t>0; t/=2) { if(t%2==1) ret*=tmp; tmp = tmp * tmp; } return ret; } #define INF HUGE_VAL #define TAU 1e-12 #define Malloc(type,n) (type *)malloc((n)*sizeof(type)) static void print_string_stdout(const char *s) { fputs(s,stdout); fflush(stdout); } static void (*svm_print_string) (const char *) = &print_string_stdout; #if 1 static void info(const char *fmt,...) { char buf[BUFSIZ]; va_list ap; va_start(ap,fmt); vsprintf(buf,fmt,ap); va_end(ap); (*svm_print_string)(buf); } #else static void info(const char *fmt,...) {} #endif // // Kernel Cache // // l is the number of total data items // size is the cache size limit in bytes // class Cache { public: Cache(int l,long int size); ~Cache(); // request data [0,len) // return some position p where [p,len) need to be filled // (p >= len if nothing needs to be filled) int get_data(const int index, Qfloat **data, int len); void swap_index(int i, int j); private: int l; long int size; struct head_t { head_t *prev, *next; // a circular list Qfloat *data; int len; // data[0,len) is cached in this entry }; head_t *head; head_t lru_head; void lru_delete(head_t *h); void lru_insert(head_t *h); }; Cache::Cache(int l_,long int size_):l(l_),size(size_) { head = (head_t *)calloc(l,sizeof(head_t)); // initialized to 0 size /= sizeof(Qfloat); size -= l * sizeof(head_t) / sizeof(Qfloat); size = max(size, 2 * (long int) l); // cache must be large enough for two columns lru_head.next = lru_head.prev = &lru_head; } Cache::~Cache() { for(head_t *h = lru_head.next; h != &lru_head; h=h->next) free(h->data); free(head); } void Cache::lru_delete(head_t *h) { // delete from current location h->prev->next = h->next; h->next->prev = h->prev; } void Cache::lru_insert(head_t *h) { // insert to last position h->next = &lru_head; h->prev = lru_head.prev; h->prev->next = h; h->next->prev = h; } int Cache::get_data(const int index, Qfloat **data, int len) { head_t *h = &head[index]; if(h->len) lru_delete(h); int more = len - h->len; if(more > 0) { // free old space while(size < more) { head_t *old = lru_head.next; lru_delete(old); free(old->data); size += old->len; old->data = 0; old->len = 0; } // allocate new space h->data = (Qfloat *)realloc(h->data,sizeof(Qfloat)*len); size -= more; swap(h->len,len); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值