一、朴素贝叶斯分类器
朴素贝叶斯算法是统计学的一种分类方法,朴素是因为该算法假设特征之间相互独立,首先理解一下贝叶斯定理,其实就是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;
}
};
明儿我就又溜去找我宝啦,停更!!