Decorative image frame

机器学习之线性回归

回归问题,可以说是一个很有趣的问题——用已有的数据去预测未来的数据。

回归问题其实我们很早就学习过了,其本质就是找到一个方程去拟合一个数据的变换情况,假设方程是这个

y=X * w (x,w均为向量,y就是向量的内积)

那么如何去判断这个函数与实际是否贴切?那我们就要计算真实值与预测值之间的误差总值

error=sum{(y_true[i] - y_pre[i])^2}

error的值域为零到正无穷,当error等于0时,我们说这个方程就是这个数据的表现,当error很大时,我们的这个方程并不能体现这个数据的变化。因此,我们希望我们的error越小越好,这个减小error的过程就是机器学习的过程。

Read More...

记一次竞赛题目有感——根据姓名预测男女性别

比赛连接 sofasofa.io

根据姓名预测男女性别

今天尝试着做了一道机器学习题——根据姓名预测男女性别。这道题目其实算法就是二分类的题目,这类算法很多,比如knn近邻算法,决策树,svm向量机等等;传统的机器学习算法可以达到百分之七十到百分之八十五之间,我想能不能用深度学习来做一下看看能达到多高的accuracy率。

我们每天会接触不同的人,有热情的面孔,也有冰冷的名片。作为一个说着中国话的中国人,我们有着常年累月的积累和对文字的理解,通过名字判断(猜测)性别,并非难事。可是,对于一个冰冷的机器,它能够根据名字判断性别吗?这个练习赛就是根据中文名字(姓已经省略),判断性别

Read More...

机器学习之Logistic回归

之前说了利用knn,决策树,朴素贝叶斯来实现分类的机器学习算法,各有优缺点;这次学习了新的用于分类的机器学习算法——Logistic回归的分类算法

Logistic算法最重要的就是为现有的数据集建立回归公式,得到回归直线,举一个例子:

machine-learning-4.1

上图就是一个典型的Logistic分类的应用,图中蓝色矩形色块和红色圆形色块是两个不同的类别,图中的直线就是一条回归直线。可以看到这条直线将蓝色矩形色块和红色圆形色块分割开来了,如果这个看作是一个分类问题的话,那么位于直线上方的点归类到蓝色矩形色块中,位于直线下方的点可以归类到红色圆形色块中,而这条回归直线,就是分类标准,而得到这条直线的过程,就是所要说的Logistic回归了。

Logistic回归

回归,也可以称作最佳拟合,就拿上面的例子说,希望找到一条最好的直线能够最大化的区分蓝色矩形色块与红色圆形色块,那么这条回归直线的参数就是所需要求的,并且希望得到一组最优参数,使得得到的直线是最优拟合的直线。

Read More...

机器学习之朴素贝叶斯

分类算法有前面说的knn和决策树,这两个算法中,决策树是knn的优化版,因为knn算法虽然是实现分类的万金油算法,但是它的计算量太庞大;而决策树又不容易分类成功,泛化能力弱以及容易过拟合。因此,今天学习了利用概率来实现分类的入门算法——朴素贝叶斯。

朴素贝叶斯最重要的就是条件概率,那么什么是条件概率?

条件概率

p(A|B) = p(A & B) / p(B),意思是指在B条件下发生A事件的概率;举一个例子,假设有十个小球:四个白的,六个黑的。如果都放到一个黑箱子中,取到白球的概率是2/5,取到黑球的概率是3/5;如果现在有两个箱子A.B,A箱子中有五个球:三个白球两个黑球;B箱子中有五个球:一个白球四个黑球;那么,我取到B箱子中黑球的概率是多少?这就是一个典型的条件概率事件。我们可以这样算:用B箱子中的黑球个数除以总的球数得到pa,然后在用B箱子中的总球数除以总球数得到pb,然后只需要用pa/pb就可以得出最后我们要求的概率

1
pa = 1 / 10; pb = 5 / 10; p(黑球|B箱子) = pa / pb = 1 / 5;
Read More...

机器学习之决策树

在上一篇文章中我们介绍了knn算法,knn算法是很简单的机器学习算法,但是它也有一些缺点,比如计算量太大,无法给出数据内在的含义;因此,今天来说一说knn的优化版——决策树。

决策树其实不需要有什么机器学习的基础,它将信息很直观的在图中显示了出来,下面就是一棵决策树

tree-struct

决策树由判断模块和终止模块组成,树叶就是终止模块,除树叶外的节点,就是判断模块,在判断模块中就是分类的标签,如何确定是否属于该分类,就看判断模块的的树枝上的信息,如果属于该分类,那么树枝直接连接这着树叶节点,也就是终止模块,如果不属于,那么就要进入另一个判断模块,进一步判断属于哪个分类。

因此,我们可以发现决策树的判断模块其实是重要的,采用什么判断依据来决定分类归属,决定着最终分类的准确性。那么如何确定判断依据呢?这里要引入一个信息增益(熵)的概念:信息增益是特征选择的一个重要指标,它定义为一个特征能够为分类系统带来多少信息,带来的信息越多,说明该特征越重要,相应的信息增益也就越大。信息增益等于信息熵-条件熵

信息熵:信息量度量的是一个具体事件发生了所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望

Read More...

机器学习之knn

机器学习很简单的入门——KNN近邻算法,这是一个用于将未知事物分类到已经事物分类中的算法。这个算法的原理其实很简单的,就是求两点之间的距离,通过距离大小的判断最为主要依据来判断得出未知事物与k个最相近的已知事物,在通过每个已知事物出现的标签次数,来决策出未知事物的最终分类结果。

再深入理解下knn,其实就是计算两事物的相似性程度,这其实是knn算法的本质——通过相似度来实现分类的功能;既然我们已经知道了knn算法的本质是计算相似性程度,那么我们就可以采用很多种方式来计算两者的相似程度了,比如我前文说的计算两个点之间的距离来计算相似度,就是计算欧式距离;我们还可以计算两个向量之间的余弦值来计算相似度,等等还有很多,具体的请点击链接 相似度计算 。我最熟悉的就是一个欧拉距离,还有就是余弦相似度计算。

knn算法的具体步骤如下

  • 人工先进行分类,得出一个标准分类
  • 对事物特征进行 one-hot编码,也就是向量化
  • 对未知事物进行编码操作
  • 计算未知事物与所有已知事物的空间距离
  • 对距离从小到大排序,取出前k个距离最小的事物分类
  • 计算这k个事物中所有便签的出现次数,标签出现次数最多的,为该未知事物的最终分类
Read More...

leetcode回顾——Two Sum 快速找到两个数字之和等于目标值

今天做了一题Leetcode的题目,是数组类型的题目,题目很短,也很简单

Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
Read More...

Bloom Filter

这两天看了下爬虫的技术,其中,爬虫有一项很重要的注意事项——过滤掉已经爬取过的URL地址。那么,这个过滤要怎么实现呢?参照之前的文章,或许我们可以维护两个队列,一个队列为保存已经访问过的URL地址,另一个队列为保存尚待爬取的URL地址,这样我们只需要把将要爬取URL地址去一访问的URL地址队列中查找,如果存在,那么就将这个URL地址入队到待爬取URL地址的队列中去。这样感觉很完美,但是,这样的时间开销对于大型爬虫程序是难以承受的,队列的查找再怎么快都需要 O(log2N)[ 折半查找、插值查找、斐波那契查找 ];这个时候Hash表查找或许会是一个不错的方案,我们用一个数组来存储URL地址信息,如果这个URL爬取了,那么我们将这个URL地址利用Hash表存储,届时如果我们需要查找某一个URL地址是否被访问过,只要需要利用Hash查找,几乎可以在 O(1) 的时间开销内查找到结果,但是呢,这还是不够,就有了今天说要讲的数据结构—— Bloom Filter

Read More...

Java原生代码实现简易版爬虫

爬虫这个操作,应该都听说过吧,更多的应该是听过Python进行爬虫操作,但是身为主攻Java的人,怎么可以不用Java来实现爬虫呢?趁着期末考试的时间,用Java原生实现了非常简单的爬虫代码,没有采用任何第三方jar包。

先来简要说一说什么是爬虫吧:爬虫就是一个网络机器人,它通过url地址浏览网页,并将所浏览过的信息保存起来。如果一个页面中有许多url地址信息,那么爬虫会先将这些url地址存储在一个工作队列中,待完成当前爬取信息工作后再从工作队列中获取下一个带爬取信息的url信息,重复刚刚的步骤。

Read More...