很多人认为机器学习高不可攀,认为它是只有少数专业学者才懂的神秘技术。毕竟,您是在让一台运行在二进制世界中的机器对现实世界产生自己的看法。你在教他们如何思考。然而,这篇文章并不是您所认为的晦涩、复杂、数学题材的文章。就像所有帮助我们认识世界的基础知识(例如:牛顿运动定律、要做的功、供求关系等)一样,机器学习的方法和概念应该简明扼要、清晰明了。不幸的是,绝大多数机器学习文献都充满了复杂的符号、晦涩的数学公式和不必要的废话。正是这一点为机器学习的简单基础的想法设置了一堵厚墙。现在看一个实际的例子,我们需要在一篇文章的末尾添加一个“你可能喜欢”的推荐功能,那么如何实现呢?为了实现这个想法,我们有一个简单的解决方案:1.获取当前文章的标题,将其拆分成独立的词分词器)2.获取除当前文章之外的所有文章3.将这些文章按照程度排序它们的内容与当前文章的标题重叠defsimilar_posts(post)title_keywords=post.title.split('')Post.all.to_a.sort|post1,post2|post1post1_title_intersection=post1.body.split('')&title_keywordspost2post2_title_intersection=post2.body.split('')&title_keywordspost2_title_intersection.length<=>post1_title_intersection.lengthend[0..9]end查找与博客文章“支持团队如何提高产品质量”类似的文章为我们提供了以下前10个最相关的文章文章:如何开始实施经过验证的解决方案了解您的客户如何做出决策设计***运行界面来取悦您的用户如何聘请设计师图标设计讨论采访歌手Ryan积极支持您的客户withInternalCommunicationsWhyItDoesnotMattertobea***JoshuaPorter专访如你所见,benchmark文章是关于如何高效支持团队的,而这与客户群体分析和讨论关系不大设计的优点。事实上,我们可以采取更好的方法。现在,我们尝试用真正的机器学习方法来解决这个问题。分两步进行:用数学形式表达文章;使用K-means聚类算法对上述数据点进行聚类分析。1.用数学形式表达文章如果我们能用数学形式表达文章,我们可以根据之前文章的相似度画图,识别不同的聚类:如上图,将每篇文章映射成坐标即可在系统上设置一个坐标点并不难,可以通过以下两步实现:找出每篇文章中的所有单词;为每篇文章创建一个数组,数组中的元素为0或1,用于表示某个词在文章中是否出现,每篇文章的数组元素顺序相同,但价值观不同。Ruby代码如下:@posts=Post.all@words=@posts.mapdo|p|p.body.split('')end.flatten.uniq@vectors=@posts.mapdo|p|@words。mapdo|w|p.body.include?(w)?1:0endend假设@words的值为:["Hello","Internal","InternalCommunication","Reader","Blog","Publish"]如果一篇文章的内容是“Helloblogpostreaders”,那么对应的数组就是:[1,0,0,1,1,1]当然我们不能用二维这样简单的工具coordinatesystem现在展示这个六维坐标点,但是涉及到的基本概念,比如两点之间的距离是互通的,可以通过二维扩展到更高的维度(所以还是可以用二维的例子来说明)说明常见的问题)。#p#2。使用K-means聚类算法对数据点进行聚类现在我们已经获得了一系列文章的坐标,我们可以尝试找到相似文章的聚类。这里我们使用一个比较简单的聚类算法——K-means算法,概括起来有五个步骤:从所有数据对象中随机选择K个对象作为初始K个聚类中心;遍历所有对象,将它们分配到最近的簇中;更新聚类中心,即计算每个聚类中对象的均值,将均值作为新的聚类中心;重复步骤3和4,直到每个簇的中心不再变化。接下来,我们以图表的形式可视化这些步骤。首先我们从一系列文章坐标中随机选择两个点(K=2):我们将每篇文章分配到其最近的簇:我们计算每个簇中所有对象的坐标的均值作为新的中心。这样,我们就完成了第一次数据迭代,现在我们根据新的聚类中心将文章重新分配到相应的聚类中。至此,我们就找到了每篇文章对应的集群!显然,即使不断迭代,聚类中心也不会改变,每篇文章对应的聚类也不会改变。上述过程的Ruby代码如下:@cluster_centers=[rand_point(),rand_point()]15.timesdo@clusters=[[],[]]@posts.eachdo|post|min_distance,min_point=nil,nil@cluster_centers.each.with_indexdo|center,i|ifdistance(center,post)
