协同过滤算法java
1. 协同过滤算法
用户行为数据在网站上最简单的存在形式就是日志,比如用户在电子商务网站中的网页浏览、购买、点击、评分和评论等活动。 用户行为在个性化推荐系统中一般分两种——显性反馈行为(explicit feedback)和隐性反馈 行为(implicit feedback)。显性反馈行为包括用户明确表示对物品喜好的行为。网站中收集显性反馈的主要方式就是评分和喜欢/不喜欢。隐性反馈行为指的是那些不能明确反应用户喜好 的行为。最具代表性的隐性反馈行为就是页面浏览行为。 按照反馈的明确性分,用户行为数据可以分为显性反馈和隐性反馈,但按照反馈的方向分, 又可以分为正反馈和负反馈。正反馈指用户的行为倾向于指用户喜欢该物品,而负反馈指用户的 行为倾向于指用户不喜欢该物品。在显性反馈中,很容易区分一个用户行为是正反馈还是负反馈, 而在隐性反馈行为中,就相对比较难以确定。
在利用用户行为数据设计推荐算法之前,研究人员首先需要对用户行为数据进行分析,了解 数据中蕴含的一般规律,这样才能对算法的设计起到指导作用。
(1) 用户活跃度和物品流行度
(2) 用户活跃度和物品流行度的关系
一般认为,新用户倾向于浏览热门的物品,因为他 们对网站还不熟悉,只能点击首页的热门物品,而老用户会逐渐开始浏览冷门的物品。如果用横坐标表示用户活跃度,纵坐标表示具有某个活跃度的所有用户评过分的物品的平均流行度。图中曲线呈明显下 降的趋势,这表明用户越活跃,越倾向于浏览冷门的物品。
仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。学术界对协同过滤算法进行了深入研究,提出了很多方法,比如基于邻域的方法(neighborhood-based)、隐语义模型 (latent factor model)、基于图的随机游走算法(random walk on graph)等。在这些方法中, 最着名的、在业界得到最广泛应用的算法是基于邻域的方法,而基于邻域的方法主要包含下面两种算法。
基于用户的协同过滤算法 :这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品
基于物品的协同过滤算法: 这种算法给用户推荐和他之前喜欢的物品相似的物品
基于邻域的算法是推荐系统中最基本的算法,该算法不仅在学术界得到了深入研究,而且在 业界得到了广泛应用。基于邻域的算法分为两大类,一类是基于用户的协同过滤算法,另一类是 基于物品的协同过滤算法。现在我们所说的协同过滤,基本上就就是指基于用户或者是基于物品的协同过滤算法,因此,我们可以说基于邻域的算法即是我们常说的协同过滤算法
(1) 基于用户的协同过滤算法(UserCF)
基于用户的协同过滤算法的基本思想是:在一个在线个性化推荐系统中,当一个用户A需要个性化推荐 时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。
Ø 从上面的描述中可以看到,基于用户的协同过滤算法主要包括两个步骤。 第一步:找到和目标用户兴趣相似的用户集合。 第二步: 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
这里,步骤1的关键是计算两个用户的兴趣相似度,协同过滤算法主要利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v) 为用户v曾经有过正反馈的物品集合。那么我们可以通过以下方法计算用户的相似度:
基于余弦相似度
(2) 基于物品的协同过滤算法(itemCF)
与UserCF同理
(3) UserCF和itemCF的比 较
首先我们提出一个问题,为什么新闻网站一般使用UserCF,而图书、电商网站一般使用ItemCF呢? 首先回顾一下UserCF算法和ItemCF算法的推荐原理。UserCF给用户推荐那些和他有共同兴 趣爱好的用户喜欢的物品,而ItemCF给用户推荐那些和他之前喜欢的物品类似的物品。从这个算 法的原理可以看到,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF 的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。 在新闻网站中,用户的兴趣不是特别细化,绝大多数用户都喜欢看热门的新闻。个性化新闻推荐更加强调抓住 新闻热点,热门程度和时效性是个性化新闻推荐的重点,而个性化相对于这两点略显次要。因 此,UserCF可以给用户推荐和他有相似爱好的一群其他用户今天都在看的新闻,这样在抓住热 点和时效性的同时,保证了一定程度的个性化。同时,在新闻网站中,物品的更新速度远远快于新用户的加入速度,而且 对于新用户,完全可以给他推荐最热门的新闻,因此UserCF显然是利大于弊。
但是,在图书、电子商务和电影网站,比如亚马逊、豆瓣、Netflix中,ItemCF则能极大地发 挥优势。首先,在这些网站中,用户的兴趣是比较固定和持久的。一个技术人员可能都是在购买 技术方面的书,而且他们对书的热门程度并不是那么敏感,事实上越是资深的技术人员,他们看 的书就越可能不热门。此外,这些系统中的用户大都不太需要流行度来辅助他们判断一个物品的 好坏,而是可以通过自己熟悉领域的知识自己判断物品的质量。因此,这些网站中个性化推荐的 任务是帮助用户发现和他研究领域相关的物品。因此,ItemCF算法成为了这些网站的首选算法。 此外,这些网站的物品更新速度不会特别快,一天一次更新物品相似度矩阵对它们来说不会造成 太大的损失,是可以接受的。同时,从技术上考虑,UserCF需要维护一个用户相似度的矩阵,而ItemCF需要维护一个物品 相似度矩阵。从存储的角度说,如果用户很多,那么维护用户兴趣相似度矩阵需要很大的空间, 同理,如果物品很多,那么维护物品相似度矩阵代价较大
下表是对二者的一个全面的表较:
2. 我想用协同过滤的算法写了一个java语言的图书推荐系统.能跟我讲一下大概要怎么做吗.有点没头绪
针对完全没有编程经验的初学者,java入门没什么特别好的书,找点视频看看吧,跟着视频敲代码,慢慢就能看懂书了。
----------------------如果坚持要看书的话可以考虑以下----------------------
1. head first java
通俗易懂,重点突出的书,比较薄,适合初学者快速入门,缺点是编辑自以为幽默的加了很多不相干的段子在里面,废话太多。
2. Java A beginner's guide by Herbert Schildt
相比head first java,没有废话,语言精炼。
3. 官方的tutorial
免费的,在线阅读的,也不错。
4. 疯狂java讲义
如果英文不够好的话,可以考虑用这本书入门,中文世界里写的比较好的
5. Introction to java programming by Y. Daniel Liang
梁勇这本书比较厚,讲算法比较多,如果你时间充足的话可以用这本书入门。
----------------------!!一定要避开这两个大坑!!----------------------
很多人推荐的core java 和 Thinking in java 其实并不适合初学者(没有编程经验的)。
1. core java内容太多太杂,没有突出重点,并且结构组织的像本字典,适合入门了以后用来系统复习。
2. Thinking in java 没有编程经验根本看不懂,过几年再看吧,不看也没关系。
3. 关于java新闻网站的算法
(一)算法伦理的研究
1.算法内涵界定。算法源于数学,但现代算法又远远不止于传统数学的计算范畴。算法多被理解为是计算机用于解决问题的程序或步骤,是现代人工智能系统的运行支柱。《计算主义:一种新的世界观》(李建会等,2012)中将算法定义为能行的方法,在外界的常识性理解中所谓算法就是能感受到的一套运算规则,这个规则的特点在于运算时间的有限性、计算步骤的有穷性、输入结果的确切性,它是机械步骤或能行可算计程序。该定义点明了算法应具备的两个基本属性—或侍李—有限性与有穷性。《用计算的观点看世界》(郦全民,2016)则从信息传播的角度解读算法,认为算法实质上是信息处理方法。
2.算法伦理研究
伦理关乎道德价值真理及其判断。存在于自然界、社会中的人,其行为应遵循一定的伦理道德规范。伦理的效应要导向善。伦理道德关注对个体存在的尊重、个体的自由、公平正义以及组织团体的延续与发展等问题。在一定程度上可以说,当今的人类社会已经不能脱离智能算法系统而运行了。
算法无时无处不在对世界产生影响,因而算法也会必然的触碰到伦理道德。和鸿鹏(2017)已指出,算法系统在人类社会生活中的广泛应用,会陷入诸多如人类面临且无法回避的伦理两难选择困境之中。而当算法与伦理发生关联时,学界一般认为会引出职业伦理和技术伦理两种伦理问题。
职业伦理主要与算法系统的开发者有关,指开发者是带有个性价值观、伦理道德观去研发算法系统的行为体,因而算法系统一开始便会掺杂着设计人主观性的伦理道德观。设计者出于何种目的开发某算法系统、面对不同问题设计者持有的伦理道德态度,这些衫迟都会在算法系统的运行中得到体现。
技术伦理是算法系统在一定意义上可称之为一种科学技术,这种技术自身及其运作结果都会负载着伦理价值。其实在一些情况下,职业伦理与技术伦理之间并没有很明确的界别,关于这一点,刘则渊跟王国豫已做过论述。
本文将主要从技术伦理的角度对算法关涉伦理这一问题尝试做深入研究。
(二)网络新闻传播的算法伦理研究
算法与技术的融合不断英语于网络新闻传播领域中,从数据新闻到机器写作,从算法推送到舆情到分析,国内新闻传媒领域的机器新闻和相关研究逐渐发展,金兼斌在《机器新闻写作:一场正在发生的革命》(2014),作者较早的将眼光聚焦于基于算法的新闻内容生产和编辑。认为在自动化新闻生产大发展的前提下,诸如新闻生产或分发中劳动密集型的基础性工作与环节都将被技术取代。张超、钟新在《从比特到人工智能:数字新闻生产的算法转向》(2017)认为算法正在从比特形式走向人工智能阶段,这种转向使得数字新闻与传统新闻的边界进一步明晰,促使数字新闻生产也产生了变革。胡万鹏在《智能算法推荐的伦理风险及防范策略》中总结了从算法推送方面:针对新闻的价值观所受到的负面影响;以及新闻的公共性、客观性和真实性受到的削弱进行分析;从受众方面:将具体对信息茧房现象以及受众的知情权和被遗忘权展开探讨;从社会影响方面,则针对社会群体、社会公共领域和社会文化所受到的消极影响展开论述。
根据以上文献的梳理可以看出,国内目前对网络新闻传播的算法伦理研究主要集中在新闻业态算法伦理失范的相关问题,因为与其他失范问题相比,这是比较容易发现的。但目前关于网络新闻传播的算法伦理的国内研究还存在不足:国内算谈棚法伦理和网络新闻传播算法伦理的研究还是在起步阶段,比较成熟的系统性研究还未出现;关于算法开发人员和平台的责任机制的研究都比较薄弱,总上所述,算法推送新闻的伦理问题研究是有必要继续加强的。
2.新闻推荐算法的兴起、发展与原理
2.1新闻推荐算法的兴起
随着计算机技术的信息处理的维度越来越高,信息处理的能力不断提升,算法技术可以从大数据中筛选出用户最关心最感兴趣的信息,改变了原有的新闻信息传播方式,重塑了新的媒介生态和传播格局。
但反过来看,在人人都能生产信息的背景下,信息的生产、传播和反馈的速度都是呈几何倍数增长,用户面对的信息越来越多。由于设备的局限性和信息海量,用户无法集中注意力看自己感兴趣的内容,也无法及时抓取对自己有用的信息,于是出现了“注意力经济”。美国经济学家迈克尔·戈德海伯(1997)认为,当今社会是一个信息极大丰富甚至泛滥的社会,而互联网的出现,加快了这一进程,信息非但不是稀缺资源,相反是过剩的。相对于过剩的信息,只有一种资源是稀缺的,那就是人们的注意力。换句话说,信息不能够一味追求量,还要有价值,价值就在于用户对信息的注意力,谁获得了用户的注意力就可以有市场的发展空间,通过“贩卖”用户的注意力能够使新媒体聚合平台获得利润,维持发展。再加上现在生活节奏越来越快,人们对信息获取的量和效率要求提高,不想把时间浪费在自己不感兴趣的信息,从而用户获取信息的“个性化”特征变得明显起来。
基于此背景下,算法推送新闻的传播机制应运而生,用户不需要特意搜索自己需要的信息,而是海量的信息会自行“找到”用户,为用户节省搜索时间之余,又能做到真正为用户提供有用的信息。
2.2新闻推荐算法的发展现状
算法推荐是依据用户数据为用户推荐特定领域的信息,根据受众使用反馈不断修正并完善推荐方案。目前主要有两类新闻机构使用算法推送,其一是新型的互联网新闻聚合类平台,国内主要是以今日头条和一点资讯等算法类平台为代表,在我国新闻客户端市场上拥有极高的占有率。张一鸣创建今日头条是依靠大数据和算法为用户推荐信息,提供连接人与信息的服务,算法会以关键词等元素判断用户的兴趣爱好,从全网抓取内容实现个性化推荐。国外则是以Facebook、Instagram等平台为代表,这些APP都是通过算法挖掘用户的数据,以用户个性化需求为导向对用户进行新闻推送。另一种则是专业新闻生产的传统媒体,为积极应对新闻市场的竞争和提高技术水平而转型到新闻全媒体平台,如国内的“人民日报”等,国外利用算法推送向用户推送新闻的传统媒体则有美国的美联社、华盛顿邮报和英国的BBC等,他们利用算法监督受众的数量还有阅读行为,使他们的新闻报道能够更加受受众的喜欢,增加用户的粘性。
2.2新闻推荐算法的原理
2.2.1新闻推荐算法的基本要素
算法推送有三个基本要素,分别是用户、内容和算法。用户是算法推送系统的服务对象,对用户的理解和认知越是透彻,内容分法的准确性和有效性就越准确。内容是算法推送系统的基本生产资料,对多种形式内通的分析、组织、储存和分发都需要科学的手段与方法。算法是算法推送技术上的支持,也是最核心的。系统中大量用户与海量的信息是无法自行匹配的,需要推送算法把用户和内容连接起来,在用户和内容之间发挥桥梁作用,高效把合适的内容推荐给合适的用户。
2.2.2新闻推荐算法的基本原理
算法推送的出现需要具备两个条件:足够的信息源和精确的算法框架。其中,算法的内容生产源与信息分发最终效果密切相关:是否有足够多的信息可供抓取与信息是否有足够的品质令用户满意都将对信息的传播效果产生影响。与此同时,分发环节也在向前追溯,改变着整个传播的生态。目前,国内新闻传播领域所使用的算法推送主要有三大类——协同过滤推送、基于内容推送和关联规则推送。
协同过滤推送分为基于用户的协同过滤和基于模型的协同过滤。前者主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的新闻文章类别,并预测目标用户对该文章的喜欢程度,就可以将其他文章推荐给用户;后者和前者是类似的,区别在此时转向找到文章和文章之间的相似度,只有找到了目标用户对某类文章的喜爱程度,那么我们就可以对相似度高的类似文章进行预测,将喜爱程度相当的相似文章推荐给用户。因此,前者利用用户历史数据在整个用户数据库中寻找相似的推送文章进行推荐,后者通过用户历史数据构造预测模型,再通过模型进行预测并推送。
基于内容的推送即根据用户历史进行文本信息特征抽取、过滤,生成模型,向用户推荐与历史项目内容相似的信息。它的优点之一就是解决了协同过滤中数据稀少时无法准确判断分发的问题。但如果长期只根据用户历史数据推荐信息,会造成过度个性化,容易形成“信息茧房”。
关联规则推送就是基于用户历史数据挖掘用户数据背后的关联,以分析用户的潜在需求,向用户推荐其可能感兴趣的信息。基于该算法的信息推荐流程主要分为两个步骤,第一步是根据当前用户阅读过的感兴趣的内容,通过规则推导出用户还没有阅读过的可能感兴趣的内容;第二是根据规则的重要程度,对内容排序并展现给用户。关联规则推送的效果依赖规则的数量和质量,但随着规则数量的增多,对系统的要求也会提高。
2.2.3算法推送的实现流程
在信息过载的时代,同一个新闻选题有很多同质化的报道,因此分发前需要对新闻内容进行消重,消重后的新闻内容便等待推送,此时的推送有三个类别:启动推送、扩大推送和限制推送。
3.“今日头条”新闻推荐算法分析
“今日头条”是国内一款资讯类的媒体聚合平台,每天有超过1.2亿人使用。从“你关心的,才是头条!”到如今的“信息创造价值!”,产品slogan的变化也意味着今日头条正逐渐摆脱以往单一、粗暴的流量思维,而开始注重人与信息的连接,在促进信息高效、精准传播的同时注重正确的价值引导。
在2018年初,“今日头条”的资深算法架构师曹欢欢博士在一场分享交流会上公开了其算法运行原理。在他的叙述中,非常详细地介绍了“今日头条”的算法推荐系统概述以及算法推荐系统的操作原理。
3.1.1-1曹欢欢博士的今日头条算法建模
上图用数学形式化的方法去描述“今日头条”的算法推送,实际上就是一个能够得出用户对内容满意程度的函数:即y为用户对内容的满意度,Xi,Xc,Xu分别是今日头条公开的算法推送的三个维度:Xi是用户,包括用户的性别、年龄、职业和兴趣标签,还有其他算法模型刻画的隐形用户偏好等;Xc是环境,这也是移动互联网时代新闻推送的特点,由于用户随时随地在不停移动,移动终端也在移动,用户在不同的工作场合、旅行等场景信息推送偏好也会不同;Xu是内容,今日头条本身就是信息聚合类平台,平台上涵盖各种不同形式的内容。本章将以该函数为基础,逐一分析今日头条的推荐算法。
3.1推荐维度之一:内容分析
内容分析原指第二次世界大战期间,传播学家拉斯韦尔等研究学家组织了“战士通讯研究”的工作,以德国公开出版的战时报纸为分析研究对象,弄清报纸内容本质性的事实和趋势,揭示隐含的隐性情报内容,获取了许多军情机密情报并且对事态发展作出情报预测。在“今日头条”中,内容分析则是对文章、视频内容提取关键要素,通过对文本、视频标题关键字进行语义识别,给内容进行分类。“今日头条”的推送系统是典型的层次化文本分类算法,来帮助每篇新闻找到合适的分类,比如:第一大分类是政治、科技、财经、娱乐、体育等,体育类可以下分篮球、足球、网球等,足球又可以下分中国足球和国际足球,中国足球最后下分为甲、中超、国家队等。这一步是对文章进行对这个工作主要目的是对文章进行分类,方便以后对客户推荐。
想要内容分析实现效果,则需要海量的内容信息给算法系统提供有效的筛选和分类。“今日头条”既然是依赖于算法推送新闻,那它背后的数据库必然是强大的,“网页蜘蛛”和“头条号”就是支撑今日头条平台消息来源的重要渠道,其消息来源极其丰富,何时何地有何新鲜事,都能高效率抓取信息。
第一个消息来源的渠道是“网页蜘蛛”,“网页蜘蛛”又叫网页爬虫,头条使用的就是搜索引擎爬虫叫“Bytespider”。它能按照一定的规则,自动爬行抓取互联网的信息或脚本,就像蜘蛛通过蛛网进行捕食,当发现新的信息资源,蜘蛛会立刻出动抓取信息内容并将其收入自己的数据库中。和微信的垂直搜索不同,Bytespider是能够抓取全网内容的全新搜索引擎,因此“今日头条”的搜索引擎功能很全面,搜索的资源很广,资源包容性极高。
Bytespider信息抓取的基本流程如下:首先是网页抓取。Bytespider顺着网页中的超链接,从这个网站爬到另一个网站,通过超链接分析连续访问抓取更多网页。被抓取的网页被称之为网页快照。由于互联网中超链接的应用很普遍,理论上,从一定范围的网页出发,就能搜集到绝大多数的网页。第二步是处理网页。搜索引擎抓到网页后,还要做大量的预处理工作,才能提供检索服务。其中,最重要的就是提取关键词,建立索引库和索引。其他还包括消除重复网页、判断网页类型、分析超链接、计算网页的重要度、丰富度等。第三步提供检索服务。用户输入关键词进行检索,搜索引擎从索引数据库中找到匹配该关键词的网页,为了用户便于判断,除了网页标题和URL外,还会提供一段来自网页的摘要以及其他信息。
3.2推荐维度之二:用户分析
用户分析通过提取用户的有效数据,如用户经常浏览的文字类型、经常搜索的关键字、注册时登记信息的内容等,算法系统可以将每个用户的浏览记录、浏览时间、留言、评论和转发等行为进行关键字提取,最终形成用户画像,以便之后对用户进行文章和视频的精准推送。举个例子,给喜欢阅读“体育”的用户标上“体育”标签;给喜欢“娱乐”的用户标上“娱乐”的标签,这一步的作用是给用户的兴趣进行建模,包括用户对文章和视频的全局热度、分类热度,主题热度,以及关键词热度等。热度信息在大的推荐系统能够解决新闻冷启动问题,帮助新闻实现推送。
用户分析还具有协同特征,它可以在部分程度上帮助解决所谓算法越推越窄的问题。协同特征也就是“联想式”的推送方法,并非只考虑用户已有历史,而是通过用户行为分析不同用户间相似性,比如点击相似、兴趣分类相似、主题相似、兴趣词相似,甚至向量相似,从而扩展模型的探索能力。根据用户之间计算数据的相似程度,把用户细化分类成为不同的目标群体,再向目标群体集中的推送其感兴趣的新闻内容
内容分析和用户分析是相辅相成的,如果没有分析的文本标签,无法得到用户兴趣标签,没有用户的兴趣标签就无法给用户定位实现精准推送。
3.3推荐维度之三:环境分析
环境分析就是根据文章的时效性和接近性推送给相应的用户,比如获取用户当前所在位置是否在旅游区,这个可以通过获取用户的实时位置来实现。还会不断与用户之前经常出现的所在地进行对比等方式确认当前状态,分析出用户是在常住地区还是在旅行。这时若系统检测到用户正在泰山及周边游玩,则可能会相应推送泰山的相关文章、周边的交通新闻和天气信息等等。
通过上面三个推荐维度可以作为数据基础,分析当前用户处于什么环境,结合用户画像以及文章的内容分类来推荐,尽量做到推送的内容都是用户所感兴趣的。算法系统还会通过内容分类、分析抽取,把文本相似度高的文章,包括新闻主题、内容相似的文章进行消重,解决推送重复的问题,进一步对目标用户进行精确且不重复的内容推荐。最后过滤质量低俗色情的内容,以免造成平台会有负面倾向。
3.4“今日头条”新闻推荐算法的价值取向
3.4.1“用户为上”
“今日头条”的算法推送是站在用户的立场上的,以满足用户个性化和推送的精准性,“今日头条”也重新衡量了新闻价值标准:以用户为上,用户对新闻内容和阅读方式的满意度便是平台推送新闻的价值宗旨。传统媒体时代,只有报纸和电视,有什么受众就得看什么,而如今“今日头条”根据用户兴趣去进行推送。算法推送平台用户范围广,很多用户热衷关注负面,也有许多用户都有窥视欲和好奇心,喜欢无聊八卦和无聊新闻,而且在好奇心作用下用户都有从众心理。这使得生产者过度去迎合受众,只要是用户喜欢看就可以发表在“今日头条”上。
3.4.2“算法主导”
“今日头条”更注重技术分发,生产者是用户,受众者也是用户,这样一来内容监管和分发就很困难。算法推送机制根据用户爱好进行推送,这样生产的内容快、也无疑会加速内容配送效率。在算法推送模型中,用户点击频率、阅读时间、点赞评论以及转发在算法时代都是可以进行量化的目标。在这样情况下生产的内容,想要获得较大点击率和推送率,需要标题才能吸引用户,因为用户在平台一眼能看到的就是标题和配图。标题和配图决定用户是否会打开你的内容,这导致许多内容生产者在编辑新闻标题时陷入标题党的怪圈,还有导致低俗内容的呈现,以制造冲突制造悬念贴标签等方式引用户点击,意图把自己的文章做成爆文。对于海量的信息内容,即使今日头条数据和智能推荐做的再好,目前来说也难以抵挡海量的垃圾信息。
4.算法推送新闻引发的伦理问题
在如今网络时代的传播思维中,“用户为上”、“算法主导”的新闻价值取向已经在算法聚合类平台成为了普遍,算法推送技术作为吸引用户的手段,搭建起一个充满诱导的媒介环境,以此增加用户对平台的粘性。算法推送技术在获取信息、传播速度等方面与以往相比有着跨时代的进步,但与此同时,由于算法推送技术的加入,衍生出新的伦理问题,并且日渐复杂化。
4.1算法推送引发的伦理问题
4.1.1算法推送过于机械化,没有思考能力
单向的算法推荐对用户来说经常会带来内容杂乱无章、信息量过大、信息价值低等问题。从逻辑讲,算法只是从关键字的检索匹配来完成统计推荐,但对新闻报道或文学作品具有艺术性、专业性的内容来说,是不能保证推送的质量的。算法方面,目前主要基于匹配检索与统计,大部分都是个人关注的信息类型和标签,难以达到较好的推送效果。一千个人眼里有一千个哈姆雷特,但是计算机只有只有一个。算法技术过于注重机械化的统计,只根据关键词来推荐用户,对我们中国具有博大精深的中国文字文化底蕴,推荐算法是远远不够的。整个新闻客户端显得像是一个菜市场,没有态度、没有风格,阅读感受单一化,呈现了碎片化的特点。新闻不只是让用户能够了解身边发生的新鲜事,还有宣传正面思想和传播正能量的作用,新闻应该还要给人们带来新的思考。让机器做出正确判断很简单,但是让机器综合心理学、社会学、乃至某细分领域内的规则做出判断还要正确地引导受众则很难,正如现在算法技术还不能完成一篇富有人文性、文学性和批判性的深度报道,它止步在了碎片式的、表层的传播范畴。
4.1.2容易引起“信息茧房”效应
“信息茧房”这一概念是凯斯.桑斯坦在《信息乌托邦》一书中提出的。意指受众在过度的信息自我选择之中,这样会降低接触外界其他信息的可能,从而将自己的生活桎梏于蚕茧一般的“蚕房”中的现象。人们的信息领域会习惯性被自己的兴趣引导,信息窄化带来了受众对信息接收的单一性,这种单一性的可能会使受众陷入循环,加重受众信息同质化。
4.1.3算法推送的“伪中立性”
客观和全面是新闻伦理的基本要求,新闻从业者必须从可好信息源来获取真实的信息,以客观的态度反应现实。我们惯常认为,互联网技术服务商是技术中立者,不需要承担约束大众媒体的社会责任,然而当信息把关人又新闻编辑转变为算法工程师,传统的媒介伦理似乎已经失效。算法具有商业倾向性,“中立性”是算法平台用以逃避媒体责任的理由,给大众媒介造成传播乱象,如此一来更像是一场算法平台“肆意妄为又不想负责”的诡辩。
算法平台的信息源是经过选择和过滤的,“头条号”的内容占“今日头条”整个信息系统的绝大部分,然而在“人人都可以做新闻人”的时代,头条号平台是一个开放的网络媒介环境,存在大量的偏见和错误的认知。无论是“今日头条”平台设立的算法规则,还是其他爬虫的抓取的关键词,算法系统的信息源很多是具有目的性的、有偏见和非客观的信息,所以信息源不能直接作用于用户。因此,筛选算法系统的信息源与传统的人工编辑相比较,范围极广且很难把关,若算法被恶意利用,那么使整个传播系统将会被轻易控制。
4.1.4算法推送里的“议程设置”
原议程设置功能揭示的重要内涵是:“受众对新闻的看法虽然被大众媒体议程设置功能所主导,但其更深刻的是议程设置给大众媒体新闻带来放大与延伸,从而使受众对新闻选择做出能动性修正,让受众在满足需求和媒介依赖中逐渐培养出的潜在认同感”。
推送算法技术在互联网平台的运用,使原来传统媒体主导的议程设置过程发生了变化,伴随着传播权的转移、公众参与度的提高和信息量剧增等原因导致议程设置功逐渐能减弱。过往传统新闻的内容是由编辑有选择地进行报道后再呈现在受众面前的,而个性化新闻推送是用户自己来选择看哪一方面的内容,而这一环节中,天然的技术赋权将传播权从传统媒体下放至平台的用户,使得受众和社会的连接无需依赖传统媒介,新闻媒体作为把关人的作用和议程设置功能都在减弱。
4.2算法新闻治理缺陷下的算法权利异化
算法作为人工智能的基石之一,是“一种有限、确定、有效并适合用计算机程序来实现的解决问题的方法,是计算机科学的基础”。近年来,伴随人工智能深度学习算法取得的重大突破和大数据时代的到来,人工智能的应用场景不断拓展,人工智能时代正逐渐从想象成为现实。借助于海量的大数据和具备强大计算能力的硬件设备,拥有深度学习算法的人工智能机器可以通过自主学习和强化训练来不断提升自身的能力,解决很多人类难以有效应对的治理难题。伴随人工能算法在国家和社会治理中重要性的日渐凸显,国家和社会对于算法的依赖也逐渐加深,一种新型的权力形态——算法权力也随之出现。
可以把算法权利分为四种:数据主权、算法设计权、研发的资本权和算法控制权。由于前三种权利都是单向的、算法开发者赋予算法的权利,是属于算法开发者的,与算法分发平台呈现的效果没有直接的影响,所以本文将着重论述算法控制权。
算法控制权是双向的,用户是算法技术数据行为的提供者,同时又是被算法技术控制的受害者。例如我们看到“今日头条”会通过推送算法来监管用户的发布和浏览行为,同时平台会通过算法决策系统来实现内容的发布去引导用户。算法控制权当然是一种天然技术赋予的权利,但算法控制权是在用户提供数据行为的情况下才得以实现的,因此算法控制权既存在内容生产权,同时有要尊重和保护算法相对人的义务。
正因为如此,算法技术被认为是一种双刃剑,一方面算法能够做出精准的行为预测,可以为管理者提供非常好的循环干预机制;对于公共行为主体来说,可以通过对大数据的应用来解决社会治理问题,对于私人主体来说可以借助数据来提供个性化和定制化的服务;另一方面,算法技术存在着诸如利益和风险不对称等问题,而且由于算法技术发展的超前性,新科技的创造者具备不对称的信息和技术优势,能够按照自身利益的需求来塑造在平台上的算法推送逻辑和社会系统,这带来了监管的不确定性。人们要通过集体行为去承担社会责任,通过这样的方式规制算法权利,可以让我们能够对算法分发系统的意义和价值得到更深刻的思考。
4. 协同过滤java用什么实现
众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法;例如,我们要将数据库(不论是什么数据库)的数据导出到一个文件,一般是Excel或文本格式的CSV;对于Excel来讲,对于POI和JXL的接口,你很多时候没有法去控制内存什么时候向磁盘写入,很恶心,而且这些API在内存构造的对象大小将比数据原有的大小要大很多倍数,所以你不得不去拆分Excel,还好,POI开始意识到这个问题,在3.8.4的版本后,开始提供cache的行数,提供了SXSSFWorkbook的接口,可以设置在内存中的行数,不过可惜的是,他当你超过这个行数,每添加一行,它就将相对行数前面的一行写入磁盘(如你设置2000行的话,当你写第20001行的时候,他会将第一行写入磁盘),其实这个时候他些的临时文件,以至于不消耗内存,不过这样你会发现,刷磁盘的频率会非常高,我们的确不想这样,因为我们想让他达到一个范围一次性将数据刷如磁盘,比如一次刷1M之类的做法,可惜现在还没有这种API,很痛苦,我自己做过测试,通过写小的Excel比使用目前提供刷磁盘的API来写大文件,效率要高一些,而且这样如果访问的人稍微多一些磁盘IO可能会扛不住,因为IO资源是非常有限的,所以还是拆文件才是上策;而当我们写CSV,也就是文本类型的文件,我们很多时候是可以自己控制的,不过你不要用CSV自己提供的API,也是不太可控的,CSV本身就是文本文件,你按照文本格式写入即可被CSV识别出来;如何写入呢?下面来说说。。。在处理数据层面,如从数据库中读取数据,生成本地文件,写代码为了方便,我们未必要1M怎么来处理,这个交给底层的驱动程序去拆分,对于我们的程序来讲我们认为它是连续写即可;我们比如想将一个1000W数据的数据库表,导出到文件;此时,你要么进行分页,oracle当然用三层包装即可,mysql用limit,不过分页每次都会新的查询,而且随着翻页,会越来越慢,其实我们想拿到一个句柄,然后向下游动,编译一部分数据(如10000行)将写文件一次(写文件细节不多说了,这个是最基本的),需要注意的时候每次buffer的数据,在用outputstream写入的时候,最好flush一下,将缓冲区清空下;接下来,执行一个没有where条件的SQL,会不会将内存撑爆?是的,这个问题我们值得去思考下,通过API发现可以对SQL进行一些操作,例如,通过:PreparedStatementstatement=connection.prepareStatement(sql),这是默认得到的预编译,还可以通过设置:PreparedStatementstatement=connection.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);来设置游标的方式,以至于游标不是将数据直接cache到本地内存,然后通过设置statement.setFetchSize(200);设置游标每次遍历的大小;OK,这个其实我用过,oracle用了和没用没区别,因为oracle的jdbcAPI默认就是不会将数据cache到java的内存中的,而mysql里头设置根本无效,我上面说了一堆废话,呵呵,我只是想说,java提供的标准API也未必有效,很多时候要看厂商的实现机制,还有这个设置是很多网上说有效的,但是这纯属抄袭;对于oracle上面说了不用关心,他本身就不是cache到内存,所以java内存不会导致什么问题,如果是mysql,首先必须使用5以上的版本,然后在连接参数上加上useCursorFetch=true这个参数,至于游标大小可以通过连接参数上加上:defaultFetchSize=1000来设置,例如:jdbc:mysql://xxx.xxx.xxx.xxx:3306/abc?zeroDateTimeconvertToNull&useCursorFetch=true&defaultFetchSize=1000上次被这个问题纠结了很久(mysql的数据老导致程序内存膨胀,并行2个直接系统就宕了),还去看了很多源码才发现奇迹竟然在这里,最后经过mysql文档的确认,然后进行测试,并行多个,而且数据量都是500W以上的,都不会导致内存膨胀,GC一切正常,这个问题终于完结了。我们再聊聊其他的,数据拆分和合并,当数据文件多的时候我们想合并,当文件太大想要拆分,合并和拆分的过程也会遇到类似的问题,还好,这个在我们可控制的范围内,如果文件中的数据最终是可以组织的,那么在拆分和合并的时候,此时就不要按照数据逻辑行数来做了,因为行数最终你需要解释数据本身来判定,但是只是做拆分是没有必要的,你需要的是做二进制处理,在这个二进制处理过程,你要注意了,和平时read文件不要使用一样的方式,平时大多对一个文件读取只是用一次read操作,如果对于大文件内存肯定直接挂掉了,不用多说,你此时因该每次读取一个可控范围的数据,read方法提供了重载的offset和length的范围,这个在循环过程中自己可以计算出来,写入大文件和上面一样,不要读取到一定程序就要通过写入流flush到磁盘;其实对于小数据量的处理在现代的NIO技术的中也有用到,例如多个终端同时请求一个大文件下载,例如视频下载吧,在常规的情况下,如果用java的容器来处理,一般会发生两种情况:其一为内存溢出,因为每个请求都要加载一个文件大小的内存甚至于,因为java包装的时候会产生很多其他的内存开销,如果使用二进制会产生得少一些,而且在经过输入输出流的过程中还会经历几次内存拷贝,当然如果有你类似nginx之类的中间件,那么你可以通过send_file模式发送出去,但是如果你要用程序来处理的时候,内存除非你足够大,但是java内存再大也会有GC的时候,如果你内存真的很大,GC的时候死定了,当然这个地方也可以考虑自己通过直接内存的调用和释放来实现,不过要求剩余的物理内存也足够大才行,那么足够大是多大呢?这个不好说,要看文件本身的大小和访问的频率;其二为假如内存足够大,无限制大,那么此时的限制就是线程,传统的IO模型是线程是一个请求一个线程,这个线程从主线程从线程池中分配后,就开始工作,经过你的Context包装、Filter、拦截器、业务代码各个层次和业务逻辑、访问数据库、访问文件、渲染结果等等,其实整个过程线程都是被挂住的,所以这部分资源非常有限,而且如果是大文件操作是属于IO密集型的操作,大量的CPU时间是空余的,方法最直接当然是增加线程数来控制,当然内存足够大也有足够的空间来申请线程池,不过一般来讲一个进程的线程池一般会受到限制也不建议太多的,而在有限的系统资源下,要提高性能,我们开始有了newIO技术,也就是NIO技术,新版的里面又有了AIO技术,NIO只能算是异步IO,但是在中间读写过程仍然是阻塞的(也就是在真正的读写过程,但是不会去关心中途的响应),还未做到真正的异步IO,在监听connect的时候他是不需要很多线程参与的,有单独的线程去处理,连接也又传统的socket变成了selector,对于不需要进行数据处理的是无需分配线程处理的;而AIO通过了一种所谓的回调注册来完成,当然还需要OS的支持,当会掉的时候会去分配线程,目前还不是很成熟,性能最多和NIO吃平,不过随着技术发展,AIO必然会超越NIO,目前谷歌V8虚拟机引擎所驱动的node.js就是类似的模式,有关这种技术不是本文的说明重点;将上面两者结合起来就是要解决大文件,还要并行度,最土的方法是将文件每次请求的大小降低到一定程度,如8K(这个大小是经过测试后网络传输较为适宜的大小,本地读取文件并不需要这么小),如果再做深入一些,可以做一定程度的cache,将多个请求的一样的文件,cache在内存或分布式缓存中,你不用将整个文件cache在内存中,将近期使用的cache几秒左右即可,或你可以采用一些热点的算法来配合;类似迅雷下载的断点传送中(不过迅雷的网络协议不太一样),它在处理下载数据的时候未必是连续的,只要最终能合并即可,在服务器端可以反过来,谁正好需要这块的数据,就给它就可以;才用NIO后,可以支持很大的连接和并发,本地通过NIO做socket连接测试,100个终端同时请求一个线程的服务器,正常的WEB应用是第一个文件没有发送完成,第二个请求要么等待,要么超时,要么直接拒绝得不到连接,改成NIO后此时100个请求都能连接上服务器端,服务端只需要1个线程来处理数据就可以,将很多数据传递给这些连接请求资源,每次读取一部分数据传递出去,不过可以计算的是,在总体长连接传输过程中总体效率并不会提升,只是相对相应和所开销的内存得到量化控制,这就是技术的魅力,也许不要太多的算法,不过你得懂他。类似的数据处理还有很多,有些时候还会将就效率问题,比如在HBase的文件拆分和合并过程中,要不影响线上业务是比较难的事情,很多问题值得我们去研究场景,因为不同的场景有不同的方法去解决,但是大同小异,明白思想和方法,明白内存和体系架构,明白你所面临的是沈阳的场景,只是细节上改变可以带来惊人的效果。
5. 推荐系统(一):基于物品的协同过滤算法
协同过滤(collaborative filtering)算法是最经典、最常用的推荐算法。其基本思想是收集用户偏好,找到相似的用户或物品,然后计算并推荐。
基于物品的协同过滤算法的核心思想就是:给用户推荐那些和他们之前喜欢的物品相似的物品。主要可分为两步:
(1) 计算物品之间的相似度,建立相似度矩阵。
(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。
相似度的定义有多种方式,下面简要介绍其中几种:
其中,分母 是喜欢物品 的用户数,而分子 是同时喜欢物品 和物品 的用户数。因此,上述公式可以理解为喜欢物品 的用户中有多少比例的用户也喜欢物品 。
上述公式存在一个问题。如果物品 很热门, 就会很大,接近1。因此,该公式会造成任何物品都会和热门的物品有很大的相似度,为了避免推荐出热门的物品,可以用下面的公式:
这个公式惩罚了物品 的权重,因此减轻了热门物品会和很多物品相似的可能性。
另外为减小活跃用户对结果的影响,考虑IUF(nverse User Frequence) ,即用户活跃度对数的倒数的参数,认为活跃用户对物品相似度的贡献应该小于不活跃的用户。
为便于计算,还需要进一步将相似度矩阵归一化 。
其中 表示用户 对物品 的评分。 在区间 内,越接近1表示相似度越高。
表示空间中的两个点,则其欧几里得距离为:
当 时,即为平面上两个点的距离,当表示相似度时,可采用下式转换:
距离越小,相似度越大。
一般表示两个定距变量间联系的紧密程度,取值范围为[-1,1]
其中 是 和 的样品标准差
将用户行为数据按照均匀分布随机划分为M份,挑选一份作为测试集,将剩下的M-1份作为训练集。为防止评测指标不是过拟合的结果,共进行M次实验,每次都使用不同的测试集。然后将M次实验测出的评测指标的平均值作为最终的评测指标。
对用户u推荐N个物品(记为 ),令用户u在测试集上喜欢的物品集合为 ,召回率描述有多少比例的用户-物品评分记录包含在最终的推荐列表中。
准确率描述最终的推荐列表中有多少比例是发生过的用户-物品评分记录。
覆盖率反映了推荐算法发掘长尾的能力,覆盖率越高,说明推荐算法越能够将长尾中的物品推荐给用户。分子部分表示实验中所有被推荐给用户的物品数目(集合去重),分母表示数据集中所有物品的数目。
采用GroupLens提供的MovieLens数据集, http://www.grouplens.org/node/73 。本章使用中等大小的数据集,包含6000多用户对4000多部电影的100万条评分。该数据集是一个评分数据集,用户可以给电影评1-5分5个不同的等级。本文着重研究隐反馈数据集中TopN推荐问题,因此忽略了数据集中的评分记录。
该部分定义了所需要的主要变量,集合采用字典形式的数据结构。
读取原始CSV文件,并划分训练集和测试集,训练集占比87.5%,同时建立训练集和测试集的用户字典,记录每个用户对电影评分的字典。
第一步循环读取每个用户及其看过的电影,并统计每部电影被看过的次数,以及电影总数;第二步计算矩阵C,C[i][j]表示同时喜欢电影i和j的用户数,并考虑对活跃用户的惩罚;第三步根据式\ref{similarity}计算电影间的相似性;第四步进行归一化处理。
针对目标用户U,找到K部相似的电影,并推荐其N部电影,如果用户已经看过该电影则不推荐。
产生推荐并通过准确率、召回率和覆盖率进行评估。
结果如下所示,由于数据量较大,相似度矩阵为 维,计算速度较慢,耐心等待即可。
[1]. https://blog.csdn.net/m0_37917271/article/details/82656158
[2]. 推荐系统与深度学习. 黄昕等. 清华大学出版社. 2019.
[3]. 推荐系统算法实践. 黄美灵. 电子工业出版社. 2019.
[4]. 推荐系统算法. 项亮. 人民邮电出版社. 2012.
[5]. 美团机器学习实践. 美团算法团队. 人民邮电出版社. 2018.
6. Spark 推荐算法-协同过滤-java的语句意思
协同过滤(Collaborative Filtering)的基本概念就是把这种方式变成自动化的流程
协同过滤主要是以属性或兴趣相近的用户经验与建议作为提供个性化的基础。透过协同过滤,有助于搜集具有类似偏好或属性的用户,并将其意见提供给同一集群中的用户作为参考,以满足人们通常在决策之前参考他人意见的心态。
本人认为,协同过滤技术应包括如下几方面:(1)一种比对和搜集每个用户兴趣偏好的过程;(2)它需要许多用户的信息去预测个人的兴趣偏好;(3)通过对用户之间兴趣偏好相关程度的统计去发展建议那些有相同兴趣偏好的用户。
7. 协同过滤的算法简介
电子商务推荐系统的一种主要算法。
协同过滤推荐(Collaborative Filtering recommendation)是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,协同过滤分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度预测。
与传统文本过滤相比,协同过滤有下列优点:
(1)能够过滤难以进行机器自动基于内容分析的信息。如艺术品、音乐;
(2)能够基于一些复杂的,难以表达的概念(信息质量、品位)进行过滤;
(3)推荐的新颖性。
正因为如此,协同过滤在商业应用上也取得了不错的成绩。Amazon,CDNow,MovieFinder,都采用了协同过滤的技术来提高服务质量。
缺点是:
(1)用户对商品的评价非常稀疏,这样基于用户的评价所得到的用户间的相似性可能不准确(即稀疏性问题);
(2)随着用户和商品的增多,系统的性能会越来越低;
(3)如果从来没有用户对某一商品加以评价,则这个商品就不可能被推荐(即最初评价问题)。
因此,现在的电子商务推荐系统都采用了几种技术相结合的推荐技术。
案例: AMAZON个性化推荐系统先驱 (基于协同过滤)
AMAZON是一个虚拟的网上书店,它没有自己的店面,而是在网上进行在线销售。它提供了高质量的综合节目数据库和检索系统,用户可以在网上查询有关图书的信息。如果用户需要购买的话,可以把选择的书放在虚拟购书篮中,最后查看购书篮中的商品,选择合适的服务方式并且提交订单,这样读者所选购的书在几天后就可以送到家。
AMAZON书店还提供先进的个性化推荐功能,能为不同兴趣偏好的用户自动推荐尽量符合其兴趣需要的书籍。 AMAZON使用推荐软件对读者曾经购买过的书以及该读者对其他书的评价进行分析后,将向读者推荐他可能喜欢的新书,只要鼠标点一下,就可以买到该书;AMAZON能对顾客购买过的东西进行自动分析,然后因人而异的提出合适的建议。读者的信息将被再次保存,这样顾客下次来时就能更容易的买到想要的书。此外,完善的售后服务也是AMAZON的优势,读者可以在拿到书籍的30天内,将完好无损的书和音乐光盘退回AMAZON,AMAZON将原价退款。当然AMAZON的成功还不止于此,如果一位顾客在AMAZON购买一本书,下次他再次访问时,映入眼帘的首先是这位顾客的名字和欢迎的字样。