今日小结——20190515(LeetCode日常+贝叶斯分类器学习)

一、朴素贝叶斯分类器

朴素贝叶斯算法是统计学的一种分类方法,朴素是因为该算法假设特征之间相互独立,首先理解一下贝叶斯定理,其实就是B出现的前提下事件A发生的概率等于A出现的前提下B事件发生的概率乘以事件A单独发生的概率,再除以事件B单独发生的概率。

首先对于已知类别,朴素贝叶斯分类器在估计类条件概率时假设特征之间条件独立,这样的话可以使得在有限的训练样本条件下,原本难以计算的联合概率转化为每个类别条件概率的乘积。尤其是特征很多的时候,就更加简便

总之一句话就是,在统计资料的基础上依据某些特征计算各个类别的概率,从而实现分类~

这个算法分类效果好,并且适合大规模数据集,对噪声和缺失数据不敏感。但是缺点也有很多,必须先知道先验概率,而先验概率取决于假设,假设不确定性太大。

demo学习是一个英文文本分类问题。数据集采用经典二分类数据集

from sklearn.datasets import load_breast_cancer
from sklearn.cross_validation import train_test_split  
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score

# 准备数据集。

data = load_breast_cancer()
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']

# 分离训练集和验证集。

train, test, train_labels, test_labels = train_test_split(features,labels,test_size=0.33,random_state=42) 

# 创建朴素贝叶斯分类器,并拟合数据集。

gnb = GaussianNB()
model = gnb.fit(train, train_labels)

# 在验证集上进行预测,并输出 accuracy score,混淆矩阵和分类报告。

preds = gnb.predict(test) 
print('accuracy_score:',accuracy_score(test_labels, preds))
print('混淆矩阵:\n',confusion_matrix(test_labels, preds))
print('分类报告:\n',classification_report(test_labels, preds))

数据集就是从sklearn中导入的癌症数据集,并且设置好label和feature,创建贝叶斯分类器然后进行数据集的拟合,然后再验证集上进行预测。这里输出混淆矩阵是因为混淆矩阵是评判模型优劣的参数,适用于分类型的数据模型

在混淆矩阵中,肯定希望是TP和TN的数值大一些比较好,相当于预测全部准确。

二、#34:在排序数组搜索首末位置

题目要求是在一个升序数组中找到目标值的首末位置,然后时间复杂度是logN

这个题目比上一个还简单。。。直接类似二分的做法,判断条件思考一下就好

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res;
        int len=nums.size();
        vector<int> res_0={-1,-1};
        int i,j;
        for(i=0;i<len;i++)
        {
            if(nums[i]==target)
            {
                res.push_back(i);
                break;
            }
        }
        for(j=len-1;j>-1;j--)
        {
            if(nums[j]==target)
            {
                res.push_back(j);
                break;
            }
        }
        if(i==len||(i!=len&&j==-1))
            return res_0;
        else
            return res;
    }
};

三、#35:搜索插入位置

题目要求就不说了 ,找target的位置,如果没有,就插入这个升序,有就返回位置,当然就是先找有没有等于的,有的话就直接return,然后要插入的位置思考一下其实和等于是一样的,直接顶替较大值的位置,简单粗暴,由于编译的特殊性,最后一定要return一个全长,不然报错哦,代码如下:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int len=nums.size();
        int i;
        if(target>nums[len-1])
            return len;
        for(i=0;i<len;i++)
        {
            if(nums[i]==target)
            {
                return i;
            }
        }
        if(i==len)
        {
            for(int j=0;j<len;j++)
            {
                if(nums[j]>target)
                    return j;
            }
        }
        return len;
    }
};

明儿我就又溜去找我宝啦,停更!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值