`
网哟游啊
  • 浏览: 1121 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

机器学习其实比你想的更简单

 
阅读更多

很多人觉得机器学习高不可攀,认为这是一门只有少数专业学者才了解的神秘技术。

毕竟,你是在让运行在二进制世界里的机器得出它自己对现实世界的认识。你正在教它们如何思考。然而,本文几乎不是你所认为的晦涩难懂、复杂而充满数学公式的文章。正如所有帮助我们认识世界的基本常识一样(例如:牛顿运动定律、工作需要去完成、供需关系等等),机器学习最佳的方法和概念也应该是简洁明了的。可惜的是,绝大多数关于机器学习的文献都充斥着复杂难懂的符号、艰涩晦暗的数学公式和不必要的废话。正是这给机器学习简单基础的思想围上了一堵厚厚的墙。

​现在看一个实际的例子,我们需要在一篇文章的末尾增加一个“你可能喜欢”的推荐功能,那么我们该如何实现呢?

 

为了实现这个想法,我们有一个简单的解决方案:

  • 1.获得当前文章的标题并将其分割成独立的单词(译者注:原文是英文,只需要依据空格分割即可,中文分词需要用到分词器)
  • 2.获取除当前文章以外的所有文章
  • 3.将这些文章依据其内容与当前文章标题的重合程度进行排序
1
2
3
4
5
6
7
8
9
def similar_posts(post)
  title_keywords = post.title.split(' ')
  Post.all.to_a.sort |post1, post2|
    post1_title_intersection = post1.body.split(' ') & title_keywords
    post2_title_intersection = post2.body.split(' ') & title_keywords
 
    post2_title_intersection.length <=> post1_title_intersection.length
  end[0..9]
end

采用这种方法去找出与博文“支持团队如何提高产品质量”相似的文章,我们由此得到下列相关度前十的文章:

  • 如何着手实施一个经过验证的方案
  • 了解你的客户是如何做决策的
  • 设计首次运行界面以取悦你的用户
  • 如何招聘设计师
  • 图标设计的探讨
  • 对歌手Ryan的采访
  • 通过内部交流对客户进行积极支持
  • 为什么成为第一并不重要
  • 对Joshua Porter的采访
  • 客户留存、群组分析与可视化

正如你所看到的,标杆文章是关于如何有效率地进行团队支持,而这与客户群组分析、讨论设计的优点都没有太大的关系,其实我们还可以采取更好的方法。

现在,我们尝试用一种真正意义上的机器学习方法来解决这个问题。分两步进行:

  1. 将文章用数学的形式表示;
  2. 用K均值(K-means)聚类算法对上述数据点进行聚类分析。

1.将文章用数学的形式表示

如果我们可以将文章以数学的形式展示,那么可以根据文章之前的相似程度作图,并识别出不同簇群:

如上图所示,将每篇文章映射成坐标系上的一个坐标点并不难,可以通过如下两步实现:

  1. 找出每篇文章中的所有单词;
  2. 为每篇文章建立一个数组,数组中的元素为0或者1,用于表示某单词在该文章中是否出现了,每篇文章数组元素的顺序都是一样的,只是其值有差异。

Ruby代码如下:

1
2
3
4
5
6
7
8
9
10
11
@posts = Post.all
 
@words = @posts.map do |p|
  p.body.split(' ')
end.flatten.uniq
 
@vectors = @posts.map do |p|
  @words.map do |w|
    p.body.include?(w) ? 1 : 0
  end
end

假设@words 的值为:

[“你好”,”内部”,”内部交流”,”读者”,”博客”,”发布”]

如果某篇文章的内容是“你好 博客 发布 读者”,那么其对应的数组即为:

[1,0,0,1,1,1]

当然,我们现在没法使用简单的工具像二维坐标系一样展示这个六维度的坐标点,但是这其中涉及的基本概念,例如两点之间的距离都是互通的,可以通过二维推广到更高维度(因此使用二维的例子来说明问题还是行得通的)。

2.用K均值(K-means)聚类算法对数据点进行聚类分析

现在我们得到了一系列文章的坐标,可以尝试找出相似文章的群簇。这里我们采用使用一个相当简单聚类算法-K均值算法,概括起来有五个步骤:

  1. 设定一个数K,它表示群簇中对象的数目;
  2. 从所有数据对象中随机选择K个对象作为初始的K个群簇中心;
  3. 遍历所有对象,分别将它们指派到离自己最近的一个群簇中;
  4. 更新群簇中心,即计算每个群簇中对象的均值,并将均值作为该群簇的新中心;
  5. 重复3、4步骤,直到每个群簇中心不再变化。

我们接下来用图的形式形象化地展示这些步骤。首先我们从一系列文章坐标中随机选择两个点(K=2):

我们将每篇文章指派到离它最近的群簇中:

我们计算各个群簇中所有对象的坐标均值,作为该群簇新的中心。

这样我们就完成了第一次的数据迭代,现在我们将文章根据新的群簇中心重新指派到对应的群簇中去。

至此,我们找到了每篇文章对应的群簇!很明显,即使继续进行迭代群簇中心不会改变,每篇文章对应的群簇也不会改变了。

上述过程的Ruby代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@cluster_centers = [rand_point(), rand_point()]
 
15.times do
  @clusters = [[], []]
 
  @posts.each do |post|
    min_distance, min_point = nil, nil
 
    @cluster_centers.each.with_index do |center, i|
      if distance(center, post) < min_distance
        min_distance = distance(center, post)
        min_point = i
      end
    end
 
    @clusters[min_point] << post
  end
 
  @cluster_centers = @clusters.map do |post|
    average(posts)
  end
end

下面是由这个方法得到的与博文“支持团队如何提高产品质量”相似性排在前十位的文章:

  • 你对此更了解了还是你更聪明了
  • 客户反馈的三个准则
  • 从客户获取你所要的信息
  • 产品交付只是一个开始
  • 你觉得功能扩展看起来像什么
  • 了解你的用户群
  • 在正确的信息和正确的时间下转换客户
  • 与你的客户沟通
  • 你的应用有消息推送安排吗
  • 你有试着与客户沟通吗

结果不言自明。

我们仅仅用了不到40行的代码以及简单的算法介绍就实现了这个想法,然而如果你看学术论文你永远不会知道这本该有多简单。下面是一篇介绍K均值算法论文的摘要(并不知道K均值算法是谁提出的,但这是首次提出“K均值”这个术语的文章)。

如果你喜欢以数学符号去表达思想,毫无疑问学术论文是很有用处的。然而,其实有更多优质的资源可以替换掉这些繁杂数学公式,它们更实际、更平易近人。

试一试

如何为你的项目管理应用推荐标签?如何设计你的客户支持工具?或者是社交网络中用户如何分组?这些都可以通过简答的代码、简单的算法来实现,是练习的好机会!所以,如果你认为项目中面临的问题可以通过机器学习来解决,那为什么还要犹豫呢?

机器学习其实比你想象得更简单!

分享到:
评论

相关推荐

    用各种机器学习对中文微博进行情感分析【毕业设计源码】.zip

    用各种机器学习对中文微博进行情感分析【毕业设计源码】 项目介绍 1、用FastText在语料库上训练并生成词向量, 该任务语料库较小, 用fastText可以增加n-gram特征, 比传统word2vec要好 2、训练集10000条语料, 测试集...

    图解机器学习

    另外,Scikit-learn也提供了一幅清晰的路线图给大家选择:其实机器学习的基本算法都很简单,下面我们就利用二维数据和交互图形来看看机器学习中的一些基本算法以及它们的原理。(另外向BretVictor致敬,他的...

    人工智能实战-从 Python 入门到机器学习

    这个过程虽然看似简单,但是其实需要的技能和资源非常多。在数据采集方面,我们需要针对不同的问题找到合适的数据源,并且还需要对数据进行清洗、去重、去噪等处理。在模型训练方面,我们需要了解不同的机器学习算法...

    人工智能AI、机器学习模型理解.pdf

    《统计学习⽅法》上来说,⼀个机器学习的三要素为模型、策略、算法,模型就是我们简单的理解,策略主要是是损失函数和正则化项,算 法是指优化策略的算法 如果你数学很好,可以这么理解。模型就是⼀个函数y = f(x)...

    Stacking:机器学习集成模型之堆叠各种模型及工具源码-机器学习

    具体原理讲解参考,简单来说,集成学习其实都是将基本模型组合形成更优秀的模型,Stacking也不例外。stacking是各个算法训练全样本的结果再用一个元算法融合这些结果,它可以选择使用网格搜索和交叉验证。 Mlxtend...

    [神经网络设计].(美国) 网盘链接

    可以设计出许多很厉害的东西来,现在却不这样认为了,书中讲的东西其实很简单,要想读完这本书就做出什么东西来基本不可能,但是书中所讲的方法、原理能够带动读者从一种“神经”的角度思考问题,说不定哪天你所遇到...

    Python爬虫开发与项目实战,从爬虫入门 Python.docx.zip

    掌握基本的爬虫后,你再去学习 Python 数据分析、web 开发甚至机器学习,都会更得心应手。因为这个过程中,Python 基本语法、库的使用,以及如何查找文档你都非常熟悉了。 对于小白来说,爬虫可能是一件非常复杂、...

    计算机视觉-回归学习MATLAB源码

    1. 回归学习算法  回归学习(Regression Learning),又称为回归分析(Regression Analysis),是一种近似方法,从未知概率分布的随机样本中获得目标函数。   提及回归学习,常常首先想起一个概念叫做线性回归。...

    keywords:keywords,搜索关键词,包括各种教程、安全、awesome、c、Linux、运维、数据库、安卓android、ios、小程序、golang、Java、JavaScript、python、php、rust、机器学习machine learning、游戏game、各种开源项目、面试

    keywordskeywords,搜索关键词,包括各种教程、安全、awesome、c、Linux、运维、数据库、安卓android、ios、小程序、golang、Java、JavaScript、python、php、rust、机器学习machine learning、游戏game、各种开源...

    最简单的深度学习算法——感知器的前世今生

    今天,想跟大家分享一下最早也是最简单的一个机器学习模型:感知器~神经网络的AI先驱们一直依靠着神经元的绘图以及它们相互连接的方式,进行着艰难的摸索。康奈尔大学的弗兰克·罗森布拉特是最早模仿人体自动图案...

    java学习之JVM调优相关说明

    其实听着JVM调优这个词有些高大上,但是等你真正了解了他的内在原理后,还是很容易的。再简单 JVM调优大致可分为如下: 解决JVM运行过程中的问题(主要就是内存溢出的问题) 优化JVM运行时的环境,提高运行速度与...

    汇编语言学习

    嗯,搞的好像很复杂似的,其实简单理解就是计算机也有一门语言(机器语言)就像我们的汉语一样,我们汉语的构成呢是由字来构成的,机器语言(也就是电脑自己的语言,就是一些01001什么的来构成的.当初我理解的时候就想啊,...

    计算机应用基础(本)学习报告.doc

    为适应时代的发展,作为一名21世纪 的建设者,所受的社会压力将比任何时候的人都要来得沉重,因此在中山开放大学上学 期间,我必须尽可能的利用好学习时间,边工作边学习,尽可能地学习更多的知识和能 力,学会创新...

    BP神经网络的Matlab实现——人工智能算法.pdf

    BP神经⽹络的Matlab实现——⼈⼯智能算法 这⼏天在各⼤媒体上接触到了⼈⼯智能机器学习,觉得很有意思,于是开始⼊门最简单的机器算法——神经⽹络训练算法(Neural Network Training);以前⼀直觉得机器学习很⾼深...

    c#学习笔记.txt

    我觉得这样做未免有些太霸道了,如果你说这叫偏执狂我也不反对,虽然我是狮子座,可也不想被人这样看。 在C#刚刚推出的时候,大多数的程序员都不免吼上两句——不是因为高兴,而是因为又多了一种语言。他们觉得现在...

    库卡机器人怎么用c语言写程序-KUKA机器人之了解简单的机器人程序.pdf

    库卡机器⼈怎么⽤c语⾔写程序,KUKA机器⼈之了解简单的机 器⼈程序 ⾸先提出⼏个问题: 机器⼈是怎记住位置的? 机器⼈是怎么到达它的⽬标点的? 到达⽬标点的速度多快? 什么样的姿态到达? 机器⼈能不能识别障碍? ...

    Python进阶:可视化学习Numpy

    Numpy是Python中用于数据分析、机器学习与科学计算的知名第三方库,它是Python中很多科学计算库的依赖包,如sickit-learn、SciPy、Pandas等 创建数组 Numpy中创建数组使用 np.array(list) 则可,本质其实就是将 list...

Global site tag (gtag.js) - Google Analytics