0xCAFEBABE

Just for fun


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

  • 搜索

k-近邻算法

发表于 2018-08-01 | 分类于 机器学习 | | 阅读次数:
字数统计: 3,804 字

前言

k-近邻(kNN,k-NearestNeighbor)是最简单有效的一种用于分类与回归的算法之一。所谓k最近邻,就是k个最近的邻居的意思,即每个样本都可以用它最接近的k个邻居来代表。
k值选择、距离度量、决策规则是k近邻算法的三个基本要素。
k-近邻做回归和分类的主要区别在于最后做预测时候的决策方式不同。当做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的k个样本,预测为里面有最多类别数的类别。而做回归时,一般是选择平均法,即最近的k个样本的样本输出的平均值作为回归预测值。
对于原始kNN计算量大的缺点,主要有KD树与球树两种改进算法。

参考:周志华-《机器学习》&Peter Harrington-《机器学习实战》
Mohamad Dolatshah, Ali Hadian, Behrouz Minaei-Bidgoli, “Ball-tree: Efficient spatial indexing for constrained nearest-neighbor search in metric spaces”, ArXiv e-prints, Nov 2015.

k值选择

k值越小,偏差越小、方差越大,容易过拟合,不抗噪声。
k值越大,偏差越大、方差越小,容易欠拟合。
通常采用经验值或交叉验证选取合适的k值。

计算距离

欧式距离:

曼哈顿距离:

闵可夫斯基距离:

当$p=1$时,就是曼哈顿距离;当$p=2$时,就是欧氏距离。

原始kNN(Brute Force)

原始的kNN算法在找近邻时采取的是Brute Force算法,暴力对所有训练集样本进行搜索,有两个明显的缺点:
1.需要存储全部训练集
2.计算量太大
一种有效的改进方法是事先将训练集按近邻关系分解成组,算出每组质心的位置,以质心作为代表点,和未知样本计算距离,选出距离最近的一个或若干个组,再在组的范围内应用原始的kNN算法。由于并不是将未知样本与所有样本计算距离,故该改进算法可以减少计算量,但并不能减少存储量。
实现k-近邻法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索,为了减少计算量,可以考虑使用特殊的结构存储训练数据,以减小计算距离的次数,比如引入树结构。

阅读全文 »

[个人翻译]推荐系统概述

发表于 2018-07-29 | 分类于 个人翻译 | | 阅读次数:
字数统计: 3,461 字

前言

实现简单而有效的推荐系统其实并不复杂,本文介绍了几种常见的推荐系统技术,包括基于用户/物品的协同过滤、基于内容与基于知识的推荐系统,以及这几种技术的优缺点,并使用MovieLens数据集构造了一个十分简单的基于物品的推荐系统。
文章为个人兴趣译制,原文链接请点击这里。译文已投稿至伯乐在线,感谢原作者的奉献,感谢”小米云豆粥”的校对。

推荐系统概述

“Many receive advice, only the wise profit from it.” – Harper Lee
“聆忠言者众,惟智者受益。” — 哈珀·李

我们中的许多人把推荐系统视为一种神秘的存在,因为他们觉得推荐系统似乎知道我们的想法是什么。想想看Netflix的推荐引擎,它向我们推荐电影,还有亚马逊,它向我们推荐该买什么样的商品。推荐系统从早期发展到现在,已经得到了很大的改进和完善,以不断地提高用户体验。尽管推荐系统中许多都是非常复杂的系统,但其背后的基本思想依然十分简单。

推荐系统是什么?

推荐系统是信息过滤系统的一个子类,它根据用户的偏好和行为,来向用户呈现他(或她)可能感兴趣的物品。推荐系统会尝试去预测你对一个物品的喜好,以此向你推荐一个你很有可能会喜欢的物品。

如何构建一个推荐系统?

虽然现在已经有很多种技术来建立一个推荐系统了,但我选择向你们介绍其中最简单,也是最常用的三种。他们是:一,协同过滤;二,基于内容的推荐系统;三,基于知识的推荐系统。我会解释前面的每个系统相关的弱点,潜在的缺陷,以及如何去避免它们。最后,我在文章末尾为你们准备了一个推荐系统的完整实现。

协同过滤

协同过滤,作为第一种被用在推荐系统上的技术,至今仍是最简单且最有效的。协同过滤的过程分为这三步:一开始,收集用户信息,然后以此生成矩阵来计算用户关联,最后作出高可信度的推荐。这种技术分为两大类:一种基于用户,另一种则是基于组成环境的物品。

基于用户的协同过滤

基于用户的协同过滤背后的思想是寻找与我们的目标用户具有相似品味的用户。如果Jean-Pierre和Jason曾对几部电影给出了相似的评分,那么我们认为他们就是相似的用户,接着我们就可以使用Jean Pierre的评分来预测Jason的未知评分。例如,如果Jean-Pierre喜欢星球大战3:绝地武士归来和星球大战5:帝国反击战,Jason也喜欢绝地武士归来,那么帝国反击战对Jason来说是就是一个很好的推荐。一般来说,你只需要一小部分与Jason相似的用户来预测他的评价。


阅读全文 »

Logistic回归

发表于 2018-07-21 | 分类于 机器学习 | | 阅读次数:
字数统计: 503 字

前言

本文是以《机器学习实战》、周志华《机器学习》、吴恩达《机器学习》Course公开课为基础的个人笔记。LaTeX大法好!

Sigmoid函数

定义:

下图给出了Sigmoid函数在不同坐标尺度下的两条曲线图。当x为0时,Sigmoid函数值为0.5。显然,Sigmoid函数将前一级的线性输出映射到[0,1]之间的数值概率上。如果横坐标刻度足够大,Sigmoid函数看起来很像一个阶跃函数。

阅读全文 »

基于概率论的分类方法:朴素贝叶斯

发表于 2018-07-16 | 分类于 机器学习 | | 阅读次数:
字数统计: 3,514 字

前言

本文是基于《机器学习实战》中第4章《基于概率论的分类方法:朴素贝叶斯》的个人笔记兼回顾,代码与部分公式皆来自此书,在这里向无私的作者致以最真诚的敬意。
由于原书代码用Python2.7写成,下面的代码已用Python3重写了一遍,代码地址请点击这里。

贝叶斯决策理论


在上述数据集中,我们可以简单地用下面的规则来对数据集进行分类:

  1. 如果 p1(x,y) > p2(x,y) ,那么类别为1
  2. 如果 p2(x,y) > p1(x,y) ,那么类别为2

也就是说,我们会选择高概率对应的类别。这就是贝叶斯决策理论的核心思想,即选择具有最高概率的决策。

阅读全文 »

Flask开发与网站部署踩坑

发表于 2018-06-11 | 分类于 Python | | 阅读次数:
字数统计: 1,483 字

Flask中的上下文与出入栈

  1. 当一个请求进入Flask框架,首先会实例化一个Request Context,这个上下文封装了请求的信息在Request中,并将这个上下文推入到一个栈(_request_ctx_stack/_app_ctx_strack)的结构中
  2. RequestContext在入_request_ctx_stack之前,首先会检查全局变量_app_ctx_strack是否为空,如果为空,则会把一个AppContext的对象入栈,然后再将这个请求入栈到全局变量_request_ctx_stack中
  3. current_app和request对象都是永远指向_app_ctx_strack/_request_ctx_stack的栈顶元素,也就是分别指向了两个上下文,如果这两个值是空的,那么LocalProxy就会出现unbound的状态
  4. 当请求结束的时候,这个请求会pop出栈

简单来说,每一个请求到来之后,flask都会为它新建一个RequestContext对象,并且将这个对象push进全局变量_request_ctx_stack中,在push前还要检查_app_ctx_stack,如果_app_ctx_stack的栈顶元素不存在或是与当前的应用不一致,则首先push appcontext到_app_ctx_stack中,再push requestcontext。

阅读全文 »

云计算下大数据挖掘的成本效益:以K-means算法为例

发表于 2018-05-31 | 分类于 读论文 | | 阅读次数:
字数统计: 1,926 字

原论文

Q. He, X. Zhu, D. Li, et al., “Cost-effective Big Data Mining in the Cloud: A Case Study with K-means,” in Cloud Computing (CLOUD), 2017 IEEE 10th International Conference on, 2017, pp. 74-81. (EI: 20174404313852)

摘要

在某些大数据挖掘情景下,100%的准确率是没有必要的,通常采用的是比100%准确率成本低得多的准确率,例如99%或99.9%。事实上,在某些例如天气预测和交通堵塞预测这类预测情景下,达到100%的准确率也是不可能的。所以在一个合理的准确度停下,可以达到更好的成本效益。这对于中小企业来说,是十分重要的。

在以K-means算法为例的聚类任务中,论文发现达到99%的聚类准确度只需要花费达到100%准确度的0.32%-46.17%成本。

阅读全文 »

基于OpenCV与Dlib的杠铃轨迹追踪器

发表于 2018-05-05 | 分类于 Python | | 阅读次数:
字数统计: 4,642 字

  最近想看看自己的深蹲硬拉时的杠铃轨迹,顺便检测下动作。搜了搜Iron Path可以实现,但是iOS独占,没有Android版本。怎么办?那就自己写一个吧。
  用了OpenCV3.2预置的6种Tracker(BOOSTING,MIL,KCF,TLD,MEDIANFLOW,GOTURN),Dlib预置的Tracker,以及CamShift与Template_Match总共9种追踪器实现了杠铃轨迹实时追踪(追踪目标当然不限于杠铃,其他目标也同样可以)。
  最后比较了一下以上9种追踪器的追踪效率。

示例

Image
Image

以军神的全蹲为例

阅读全文 »

Hello World

发表于 2018-05-01 | | 阅读次数:
字数统计: 3 字
1
Hello World! :)
1…45
Marticles

Marticles

48 日志
15 分类
15 标签
GitHub E-Mail
Creative Commons
© 2018 LJH's Blog | 累计字数 137.1k
载入天数...载入时分秒...
访问量