在上一篇算法中,逻辑回归作为一种二分类的分类器,一般的回归模型也是是判别模型,也就根据特征值来求结果概率。形式化表示为 $p(y | x;\theta)$,在参数 $\theta$ 确定的情况下,求解条件概率 $p(y | x)$ 。通俗的解释为:在给定特定特征后预测结果出现的概率。逻辑回归的 $y$ 是离散型,取值为 ${0,1}$ 。这里将要介绍另一个分类算法 朴素贝叶斯,用以解决 $x$ 是离散型的数据,这是判别模型,也是一个生成学习算法。 |
朴素贝叶斯是基于贝叶斯原理得到的。假设A和B为两个不相互独立的事件:
由上图可以看出,在事件B已经发生的情况下,事件A发生的概率为事件A和事件B的交集除以事件B:
\[p(A|B)=\frac{p(A\bigcap B)}{p(B)}\]同理,在事件A已经发生的情况下,事件B发生的概率为事件A和事件B的交集除以事件A:
\[p(B|A)=\frac{p(B\bigcap A)}{p(A)}\]结合这两个方程式,我们可以得到:
\[p(A|B)p(B)=p(A\bigcap B)=p(B|A)p(A)\]转换后贝叶斯定理的公式定义为:
\[P(A|B) = \frac{P(B|A)P(A)}{P(B)}\]总的来说,贝叶斯定理可以总结为:
- 贝叶斯定理是将先验概率做一次更新,得到后验概率
- 朴素贝叶斯是输入先验概率,找到后验概率,最后找到最大后验概率,作为最终的分类结果,以及分类概率
假设我们有两个装满了饼干的碗,第一个碗里有10个巧克力饼干和30个普通饼干,第二个碗里两种饼干都有20个。我们随机挑一个碗,再在碗里随机挑饼干。那么我们挑到的普通饼干来自一号碗的概率有多少?
我们用 x1 代表一号碗,x2 代表二号碗。在x1中取到普通饼干的概率是 $P(y | x1)=\frac{30}{10+30}\times\frac{1}{2}$,即抽到x1的概率是 $\frac{1}{2}$ ,再在x1中抽到普通饼干的概率是 $\frac{30}{10+30}=\frac{3}{4}$ ,同理可得 $P(y | x2)=\frac{20}{20+20}\times\frac{1}{2}$ 。而问题中挑到挑到的普通饼干来自一号碗,已知挑到普通饼干,那么这个普通饼干来自一号碗的概率为: |
根据 全概率公式 可知,其中拿到普通饼干的概率为: $P(y)=P(y | x1)P(x1)+ P(y | x2)P(x2)$ |
计算为:
\[\begin{split} P(x1|y)&=\frac{P(y|x1)P(x1)}{P(y)} \\ &=\frac{P(y|x1)P(x1)}{P(y|x1)P(x1)+ P(y|x2)P(x2)} \\ &= \frac{0.75\times0.5}{0.75\times0.5+0.5\times0.5} \\ &=0.6 \end{split}\]例如如果想实现一个垃圾邮件分类器,用邮件作为输入,确定邮件是否为垃圾邮件作为输出,即 $y\in {0,1}$,1表示是垃圾邮件0表示不是垃圾邮件,那么问题来了:给你一封邮件,怎么将邮件转化为特征向量 $\vec x$ 来表示这个邮件,以及怎样区分这封邮件是否是垃圾邮件。
电子邮件仅仅是一段文本,就像是一个词列表,因此利用词来构建特征向量 $\vec x$ 。首先遍历词典,并且得到一个词典中词的列表,假设词典中此的列表如下所示:
词 |
---|
word_1 |
word_2 |
word_3 |
… |
word_n |
假设邮件中存在字典中的词,那么特征向量 $\vec x$ 就就记为1,不存在就记为0。例如邮件中假设存在词 $[word_1,word_2,…,word_n]$ ,则该邮件的特征向量 $\vec x$ 表示为:
\[x= \begin{bmatrix} 1 \\ 1 \\ 0 \\ ... \\ 1 \end{bmatrix}\]则 $x\in {0,1}^n $ ,假设词典的长度为50000,那么 $x$ 就可能有 $2^{50000}$ 种向量。如果需要简历多项式用回归模型进行建模分类,那么可能需要 $2^{50000-1}$ 个参数 $\theta$,很明显看出需要的参数太多了,如果使用梯度下降那么收敛将会非常慢,因此利用朴素贝叶斯算法是一个很好的选择。
在朴素贝叶斯算法中,我们会对 $p(x | y)$ 做一个假设,假设给定 $y$ 的时候,其中$x \in {0,1}^{50000}$, $x_i$ 是条件独立的,根据链式法则可以得到: |
为了拟合出模型的参数,符号假设为,其中 $y=1$ 是垃圾邮件, $y=0$ 是正常邮件:
\[\phi_{i|y=1}=p(x_i=1|y=1) \phi_{i|y=0}=p(x_i=1|y=0) \phi_y=p(y=1)\]假设存在 $m$ 个样本,那么 $y=1$ 和 $y=0$ 的组合起来的似然估计表示为:
\[L(\phi_y,\phi_{i|y=0},\phi_{i|y=1})=\prod_{i=1}^m p(x^{(i)}|y^{(i)})\]假设训练样本为 $m$ 封邮件,$x_j=1$表示包含关键词 $j$,$x_j=0$表示不包含关键词 $j$,则垃圾邮件 $y=1$ 里面包含的单词 $j$ 的极大似然估计为:
\[\phi_{j|y=1}=\frac{\sum_{i=1}^ml\{x_j^{(i)}\bigcap y^{(i)}=1\}}{\sum_{i=1}^ml\{y^{(i)}=1\}}\]上述公式中,分子的含义是从 1到 $m$ 遍历垃圾邮件内容,对于标签$x_j=1$的邮件计算其中词语 $j$ 出现的邮件数目之和。换句话说就是,遍历所有垃圾邮件,统计这些垃圾邮件中包含词语 $j$ 的邮件数目。分母是对 $i$ 从1到 $m$ 求和,最后得到垃圾邮件的总数,即分母就是垃圾邮件的数目。
同理,正常邮件 $y=0$ 里面包含的单词 $j$ 的极大似然估计为:
\[\phi_{j|y=0}=\frac{\sum_{i=1}^ml\{x_j^{(i)}=1\bigcap y^{(i)}=0\}}{\sum_{i=1}^ml\{y^{(i)}=0\}}\]垃圾邮件 $y=1$ 的极大似然估计为:
\[\phi_{j|y=1}=\frac{\sum_{i=1}^ml\{x_j^{(i)}=1\bigcap y^{(i)}=1\}}{\sum_{i=1}^ml\{y^{(i)}=1\}}\]假设 $m$ 封邮件里面的词向量 $\vec x$ 和标识 $y$ 如下所示:
\[(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\]所以当垃圾邮件分类器开始训练时,假设训练垃圾邮件中包含某些词 $x$ 的概率 $p(y=1 | x)$ : |
上式中分母是由 全概率 计算出词 $p(x)$ 的概率,即假设 $word_3$ 在垃圾邮件中没有出现,那么可以得到:
\[\begin{split} p(y=1|x)&=\frac{p(x|y=1)p(y=1)}{p(x)} \\ &=\frac{(\prod_{i=1}^{50000} p(x_3|y=1))p(y=1)}{(\prod_{i=1}^{50000} p(x_3|y=1))p(y=1)+(\prod_{i=0}^n p(x_i|y=0))p(y=0)} \\ &=\frac{0}{0+0} \end{split}\]这就意味着如果 $word_3$ 在垃圾邮件中没有出现,那么概率为0,这样子很明显是不合理的,无论在数学上会导致无法继续计算,还是从概率的角度来说直接排除 $word_3$ 的可能性,其实最好的是 $word_3$ 没出现,但是还是会有概率,只是概率很低很低。举个例子来说,如果某个人投篮球,连续5次都是没投中,那么是不是投中的概率为0了,没投中的概率是1了?
为了修正这个方法,这里最好是在分子分母加上一个极小数,防止数学上的无效计算和实际中的绝对不可能发生。
继续上面投篮球的例子,假设没投中的概率记为 $p(y=0)$ ,投中的概率记为 $p(y=1)$ ,原来的概率为:
\[\begin{split} p(y=0)&=\frac{没投中的次数}{投篮球的总次数} \\ &=\frac{没投中的次数}{投中的次数+没投中的次数} \\ &=\frac{0}{5+0} \end{split}\]如果给每一项都平滑一个极小数1,代表投中篮球和没投中篮球在事先都已经发生过一次了,那么上述式子变成:
\[\begin{split} p(y=0)&=\frac{0+1}{(5+1)+(0+1)} \\ &=\frac{1}{7} \end{split}\]那么同理可以知道, $m$ 封邮件中,$x_j=1$表示包含关键词 $j$,$x_j=0$表示不包含关键词 $j$,则垃圾邮件 $y=1$ 里面包含的单词 $j$ 的极大似然估计为:
\[\phi_{j|y=1}=\frac{\sum_{i=1}^ml\{x_j^{(i)}\bigcap y^{(i)}=1\}+1}{\sum_{i=1}^ml\{y^{(i)=1}\}+2}\]正常邮件 $y=0$ 里面包含的单词 $j$ 的极大似然估计为:
\[\phi_{j|y=0}=\frac{\sum_{i=1}^ml\{x_j^{(i)}=1\bigcap y^{(i)}=0\}+1}{\sum_{i=1}^ml\{y^{(i)}=0\}+2}\]因为 $y$ 只有两种可能,我们这里也假设事先存在一封垃圾邮件和一封正常邮件,所以分子只需要+1,分母只需要+2。
总的来说,朴素贝叶斯训练阶段为,给定一组已知的训练样本 $(\vec{x_1},y_1),(\vec{x_2},y_2),…,(\vec{x_n},y_n)$,可以得到垃圾邮件中,每一个单词出现的概率:
\[p(x|y)=(\prod_{i=1}^{n}p(x_i|y_i)\]而在 预测阶段 ,给定一封邮件的单词向量 $\vec x$,求这个邮件是否是垃圾邮件,那么问题就转化为:已知单词$\vec x$已经发生,求解是否垃圾邮件p(y | x): |
上述中,$x$ 的取值只能是 $x \in {0,1 }$,$n$的长度应该等于词典中词的数目。
朴素贝叶斯是一个非常优秀的文本分类器,现在大部分垃圾邮件过滤的底层也是基于贝叶斯思想。作者收集了 25
封垃圾邮件, 25
封正常邮件,取 40
封邮件做训练,10
封邮件做测试。
加载数据:
# 打开数据集,获取邮件内容,
# spam为垃圾邮件,ham为正常邮件
def loadData():
# 选取一部分邮件作为测试集
testIndex = random.sample(range(1, 25), 5)
dict_word_temp = []
testList = []
trainList = []
testLabel = []
trainLabel = []
for i in range(1, 26):
wordListSpam = textParse(open('./email/spam/%d.txt' % i, 'r').read())
wordListHam = textParse(open('./email/ham/%d.txt' % i, 'r').read())
dict_word_temp = dict_word_temp + wordListSpam + wordListHam
if i in testIndex:
testList.append(wordListSpam)
# 用1表示垃圾邮件
testLabel.append(1)
testList.append(wordListHam)
# 用0表示正常邮件
testLabel.append(0)
else:
trainList.append(wordListSpam)
# 用1表示垃圾邮件
trainLabel.append(1)
trainList.append(wordListHam)
# 用0表示正常邮件
trainLabel.append(0)
# 去重得到词字典
dict_word = list(set(dict_word_temp))
trainData = tranWordVec(dict_word, trainList)
testData = tranWordVec(dict_word, testList)
return trainData, trainLabel, testData, testLabel
训练函数为:
# 训练函数
def train(trainData, trainLabel):
trainMatrix = np.array(trainData)
# 计算训练的文档数目
trainNum = len(trainMatrix)
# 计算每篇文档的词条数
wordNum = len(trainMatrix[0])
# 文档属于垃圾邮件类的概率
ori_auc = sum(trainLabel) / float(trainNum)
# 拉普拉斯平滑
# 分子+1
HamNum = np.ones(wordNum)
SpamNum = np.ones(wordNum)
# 分母+2
HamDenom = 2.0
SpamDenom = 2.0
for i in range(trainNum):
# 统计属于垃圾邮件的条件概率所需的数据,即P(x0|y=1),P(x1|y=1),P(x2|y=1)···
if trainLabel[i] == 1:
SpamNum += trainMatrix[i]
SpamDenom += sum(trainMatrix[i])
else:
# 统计属于正常邮件的条件概率所需的数据,即P(x0|y=0),P(x1|y=0),P(x2|y=0)···
HamNum += trainMatrix[i]
HamDenom += sum(trainMatrix[i])
# 取对数,防止下溢出
SpamVec = np.log(SpamNum / SpamDenom)
HamVec = np.log(HamNum / HamDenom)
# 返回属于正常邮件类的条件概率数组,属于垃圾邮件类的条件概率数组,文档属于垃圾邮件类的概率
return HamVec, SpamVec, ori_auc
预测函数:
# 预测函数
def predict(testDataVec, HamVec, SpamVec, ori_auc):
predictToSpam = sum(testDataVec * SpamVec) + np.log(ori_auc)
predictToHam = sum(testDataVec * HamVec) + np.log(1.0 - ori_auc)
if predictToSpam > predictToHam:
return 1
else:
return 0
预测错误一个,错误率 10%
,正确率 90%
:
数据和代码下载请关注公众号【 TTyb 】,后台回复【 机器学习 】即可获取
爬虫代码不知道怎么写
关注公众号让作者帮你解决!
在使用 `import org.apache.spark.ml.feature.VectorAssembler` 转换特征后,想要放入 `import org.apache.spark.mllib.classification.SVMWithSGD` 去训练的时候出现错误 阅读全文 » |
Python3 打包exe方式 阅读全文 » |
《漫威》系列电影中,距离《复仇者联盟4》上映一周,豆瓣分都是8.1分的钢铁侠》和《复仇者联盟3》,《钢铁侠》有353695人评价打分,《复仇者联盟3》有557491人评价打分,这两部电影是否一样好看? 阅读全文 » |
昨天收到公众号粉丝的爬虫需求:抓取平台:天猫或者淘宝;爬取对象:某个商品的各分类的价格和库存数 阅读全文 » |
在flask页面下载excel 阅读全文 » |
java.lang.NoSuchMethodError: org.apache.spark.sql.DataFrameNaFunctions.fill(JLscala/collection/Seq;)Lorg/apache/spark/sql/Dataset 阅读全文 » |
import org.apache.spark.ml.feature.{HashingTF, IDF}库中,TFIDF结果的字段含义 阅读全文 » |
spark读CSV为Dataframe和spark将Dataframe写入CSV 阅读全文 » |
将dataframe利用pyspark列合并为一行,类似于sql的GROUP_CONCAT函数。spark和pyspark的方式不能共用 阅读全文 » |
想看下最近房价是否能入手,抓取链家二手房、新房的信息,发现广州有些精装修88平米的3房2厅首付只要 29 万,平均 1.1万/平,果然钱不够信息来凑,总能发现便宜的房子! 阅读全文 » |
hive新建分区表 阅读全文 » |
hive删除表和表中的数据,以及按分区删除数据 阅读全文 » |
csdn目前设置每日使用5次后必须登录才能看到阅读更多的内容,异常恶心。因此搜罗了方法去解决这个问题 阅读全文 » |
pandas和spark的dataframe互转 阅读全文 » |
需要将代码转换为html使其显示好看一些,可以在这里进行装换 阅读全文 » |
需要调用命令行来执行某些命令,主要是用subprocess实时获取结果和捕获错误,发现subprocess的很多坑 阅读全文 » |
ubuntu的vim取消缩进 阅读全文 » |
需要实现两台机器的信息交互,使用 `socket` 进行调度 阅读全文 » |
centos7开放端口和防火墙设置 阅读全文 » |
python获取set-cookies 阅读全文 » |
记录在TensorFlow中使用GPU的一些操作 阅读全文 » |
pandas的apply操作类似于Scala的udf一样方便 阅读全文 » |
将dataframe利用pandas列合并为一行,类似于sql的GROUP_CONCAT函数 阅读全文 » |
python读取了一个list是字符串形式的[11.23,23.34],想转换成list类型 阅读全文 » |
python中使用了pandas的一些操作,特此记录下来。 阅读全文 » |
python中使用了numpy的一些操作,特此记录下来。 阅读全文 » |
Python3+Flask+uwsgi部署web服务,实现在新的IP下打开网址 阅读全文 » |
在python中,需要将整数均分成N等分。python divide integers N equal parts sum 阅读全文 » |
在Windows7下需要安装pyspark,写下教程步骤 阅读全文 » |
对于python数组的操作有点混乱,所以特此记录下来 阅读全文 » |
马尔科夫链转移矩阵计算方式 阅读全文 » |
需要将dataframe中的某一行变换为列 阅读全文 » |
scala获取某个时间间隔的时间 阅读全文 » |
Linux查看文件夹大小 阅读全文 » |
需要对dataframe按照某几列为key,对另外几列进行计算,考虑到scala的reduceByKey比groupByKey快速很多,所以使用了这个操作 阅读全文 » |
需要将Spark Dataframe转换为Scala Map集合 阅读全文 » |
Caused by: org.elasticsearch.hadoop.EsHadoopException: Could not write all entries [1/1] (Maybe ES was overloaded?). Error sample... 阅读全文 » |
spark调用distinct只能删除完全相同的行,而需要一种方法按照某几列作为唯一ID来删除重复,利用dropDuplicates可以完美解决这个问题 阅读全文 » |
spark调用elsticsearch的API对elasticsearch进行增删查改 阅读全文 » |
在 hadoop中,基于Linux命令可以给hdfs创建文件和文件夹,或者删除文件和文件夹 阅读全文 » |
spark调用hdfsAPI查询文件名字、删除文件 阅读全文 » |
hadoop使用出现安全模式错误Name node is in safe mode,退出安全模式 阅读全文 » |
在提取dataframe里面的列时,需要传入不定参数,即dataframe.select(args) 阅读全文 » |
github pages一直想添加代码高亮highlighter,基于jekyll 3.0的rouge终于搞定了 阅读全文 » |
System memory * must be at least *.Please increase heap size using the --driver--memory option or spark.driver.memory 阅读全文 » |
python万能库 阅读全文 » |
spark计算两个DataFrame的差集、交集、合集 阅读全文 » |
记录Linux查看的系统的命令,Linux查看系统、核数、CPU、位数 阅读全文 » |
任何一个电子商务公司想要存活下去,必须要时时掌控市场的动态,淘宝天猫上面的商品数据刚好能满足这样子的需求,所以写下这篇抓取教程 阅读全文 » |
特定环境下需要安装Linux suse 11 sp1,走过太多的坑,所以记录下安装的过程方便以后再使用 阅读全文 » |
在抓取网页的时候只想抓取主要的文本框,所以用了一个比较暴力的方法去识别 阅读全文 » |
在抓取网页的时候只想抓取主要的文本框,所以用了一个比较暴力的方法去识别 阅读全文 » |
python之BeautifulSoup使用 阅读全文 » |
selenium操控浏览器下拉到页面最底端 阅读全文 » |
一种去除dataframe中null、NaN和空字符串的方法,基于scala下 阅读全文 » |
chardet库是python的字符编码检测器,能够检测出各种编码的类型 阅读全文 » |
记录python读写2003和2007版本的excel的一些方式 阅读全文 » |
scala时间和时间戳互转 阅读全文 » |
在给代码带包成jar后,放到环境中运行出现No FileSystem for scheme file错误,找到解决办法 阅读全文 » |
在spark中给dataframe增加一列的方法一般使用withColumn,但是个人感觉少了很多功能,不如使用udf 阅读全文 » |
Scala查询dataFrame结构 阅读全文 » |
在使用数据库的时候,需要将查询出来的一列按照逗号合并成一行 阅读全文 » |
日志文件太多,需要清空 阅读全文 » |
安装了 `ubuntu-14` ,为了连接 `xshell` ,做出的一些配置 阅读全文 » |
在scala里面存在 调用Linux命令行的函数,得到返回的结果 阅读全文 » |
在scala中远程连接Linux,并发送相关命令到Linux上,得到返回的结果 阅读全文 » |
`spark` 中的 `reduce` 非常的好用,`reduce` 可以对 `dataframe` 中的元素进行计算、拼接等等 阅读全文 » |
很多人的个人博客用的是多说评论,但是最近多说突然说要关闭了... 阅读全文 » |
网上很多人问绑定域名要不要备案,很多人的回答是... 阅读全文 » |
从数据库提取出来的时间为 `String` 格式,现在需要转换为 `date` 并提取出里面的 *小时* 时间段 阅读全文 » |
为了加密 `.py` 文件,以前一般使用打包成exe ,但是最近发现可以将其编译成二进制文件pyc,虽然反编译难度不大,但是也需要一些水平 阅读全文 » |
python批量启动多线程 阅读全文 » |
Linux发现ctrl+c无法中断程序 阅读全文 » |
scala中spark运行内存不足 阅读全文 » |
scala打包jar并在Linux下运行 阅读全文 » |
scala的input 阅读全文 » |
scala的break和continue 阅读全文 » |
scala合并Array 阅读全文 » |
scala读取配置文件 阅读全文 » |
scala读取解析json文件 阅读全文 » |
scala判断数据类型 阅读全文 » |
IntelliJ的Scala配置 阅读全文 » |
scala的map操作 阅读全文 » |
python获取当前路径 阅读全文 » |
python的StringIO 阅读全文 » |
此方法相当于 `Linux` 系统下的`diff`,或者是 `git` 下的 `checkout` 阅读全文 » |
Linux查找文件内容 阅读全文 » |
python日志syslog运用 阅读全文 » |
python连接Linux命令行 阅读全文 » |
由于 `python` 频繁打印会导致IDE或者系统奔溃,因此将其打印信息写入日志文件中 阅读全文 » |
scala安装教程图文解说 阅读全文 » |
python获取当前运行程序的名字 阅读全文 » |
python获取文件夹名字 阅读全文 » |
python时间和时间戳互转 阅读全文 » |
python判断文件是否存在 阅读全文 » |
python创建递归文件夹 阅读全文 » |
sklearn的kmeans测试代码 阅读全文 » |
当使用库的时候,需要传递不确定个数的参数,那么写法是怎样的? 阅读全文 » |
python安装万能仓库的whl文件出错,原来是文件名弄错了 阅读全文 » |
安装sklearn库需要很多前提条件,而且不能pip3 install sklearn,因此写下教程 阅读全文 » |
Oracle查询得到的时间都是1970...,在python下将其转为时间戳 阅读全文 » |
过年很多人会发微信的红包,但是为毛很多人说自己得不到最佳,因此作者写了一个微信红包发送的算法 阅读全文 » |
在Linux下安装python3且不影响系统的python2 阅读全文 » |
hadoop完全分布式搭建 阅读全文 » |
最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM),本文讲解朴素贝叶斯 阅读全文 » |
数据挖掘中的ID3决策树算法,再次进行一个初步的学习 阅读全文 » |
虚拟机VMwareWorkstation下安装Linux系统centOS 阅读全文 » |
微信小程序在2017-01-09正式上线,本着跟上时代潮流的精神,写一份教程来看看 阅读全文 » |
埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数 阅读全文 » |
层次聚类是另一种主要的聚类方法,它具有一些十分必要的特性使得它成为广泛应用的聚类方法 阅读全文 » |
K近邻(KNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一 阅读全文 » |
以前使用聚类是用spss,现在用python自己写了一次 阅读全文 » |
大数据时代开始流行推荐算法,所以作者写了一篇教程来介绍FP-tree推荐算法 阅读全文 » |
学习了一些chrome插件的基本用法 阅读全文 » |
大数据时代开始流行推荐算法,所以作者写了一篇教程来介绍apriori推荐算法 阅读全文 » |
海龟画图很好看,试着玩了一下 阅读全文 » |
做github静态博客,学习安装jekyll 阅读全文 » |
在破解Amazon的验证码的时候,利用机器学习得到验证码破解精度超过70%,主要是训练样本不够,如果在足够的样本下达到90%是非常有可能的。 阅读全文 » |
妹子要去招聘会工作,奈何网上仅仅提供招聘会的公司名字,没有提供招聘的职位,SO我写了个小代码给妹子在智联上面搜索职位,由于时间紧迫,前程的就不写了 阅读全文 » |
selenium设置浏览器属性 阅读全文 » |
javascript获取浏览器属性 阅读全文 » |
javascript操控浏览器 阅读全文 » |
为了获取网站js渲染后的html,需要利用selenium加载网站,但是会出现加载时间过长的现象,因此可以限制其加载时间以及强制关掉加载 阅读全文 » |
win10安装配置golang 阅读全文 » |
pycharm基本设置,省得每次都要去网上找 阅读全文 » |
百度指数抓取,再用图像识别得到指数 阅读全文 » |
selenium之xpath定位和input文本 阅读全文 » |
selenium在同一浏览器下多个窗口切换 阅读全文 » |
selenium识别下拉框 阅读全文 » |
假如外出工作,需要在另一台电脑上面pull自己的某个git远程项目到本地 阅读全文 » |
妹纸推荐书籍《御伽草纸》,网上找了很久都找不到下载,估计是被Amazon版权了,但是在网易云阅读看到有书,所以就写个代码下载下来。 阅读全文 » |
标签云是现在大数据里面最喜欢使用的一种展现方式,其中在python3下也能实现标签云的效果 阅读全文 » |
RGB颜色对照图 阅读全文 » |
python3的多线程很多人无法理解是怎么运行的,因此本文从程序猿的日常生活出发,写了一个由浅入深的多线程教程,这样子大家就不会觉得陌生了,多线程真的很简单很简单! 阅读全文 » |
selenium是处理异步加载的一种方法 阅读全文 » |
python数据库操作pymysql 阅读全文 » |
详解如何搞定瀑布流 阅读全文 » |
详解如何搞定瀑布流 阅读全文 » |
java从零到变身爬虫大神 阅读全文 » |
github上传本地项目 阅读全文 » |
没事玩了一下matlab 阅读全文 » |
mysql在大学学了,现在忘记得差不多了,复习复习一下 阅读全文 » |
css初学 阅读全文 » |
学习了一些html的基本用法 阅读全文 » |
学习了一些html的基本用法 阅读全文 » |
学习了一些html的基本用法 阅读全文 » |
EDM营销:全称Email Direct Marketing,即电子邮件营销 阅读全文 » |
老板要画雷达图,但是数据好多组怎么办?不能一个一个点excel去画吧,那么可以利用python进行批量制作 阅读全文 » |
markdown初学 阅读全文 » |
在上一篇算法中,逻辑回归作为一种二分类的分类器,一般的回归模型也是是判别模型,也就根据特征值来求结果概率。形式化表示为 p(y|x;θ),在参数 θ 确定的情况下,求解条件概率 p(y|x) 。 阅读全文 » |
在上一篇算法中,线性回归实际上是 连续型 的结果,即 y∈R ,而逻辑回归的 y 是离散型,只能取两个值 y∈{0,1},这可以用来处理一些分类的问题。 阅读全文 » |
今天我们这里要讲第一个有监督学习算法,他可以用于一个回归任务,这个算法叫做 线性回归 阅读全文 » |
网站已运行
公元 年 月 农历年 年
|