最有趣的对话式小说 小程序
测试github账号是否正确 区别gitlab
用户的评价类型分为:
用户明确的给出对物品的评价。如YouTube上的“喜欢”和"不喜欢"
不让用户明确给出对物品的评价,而是通过观察他们的行为来获取偏好信息。如记录用户在纽约时报上的点击记录。用户的实际购买记录。
显示评价的问题:
隐式评价的问题:
找出最相似的物品,再结合用户的评价来给出推荐结果
基于模型(物品相似模型)的协同过滤 计算列与列之间的相似度
为解决“分数贬值”问题,从用户的评价中减去他所有评价的均值。
优点是扩展性好,对于大数据量而言,运算速度快,占用内存少。
实现代码:https://github.com/BubbleM/Python-Recommended/tree/master/chapter3/adjusted_cosine_similarity.py
实现代码:https://github.com/BubbleM/Python-Recommended/blob/master/chapter3/slope_one_recommend.py
编写可维护的代码很重要,因为开发人员花费的大部分时间都是在维护他人的代码。确保自己代码的可维护性,以便其他开发人员在此基础上更好的开展工作,提高效率。
一种让代码变得可维护的简单途径是形成一套代码的书写约定。
缩进和注释可以带来更可读的代码,在未来则更容易维护。
适当给变量和函数起名对于增加代码可理解性和可维护性非常重要。
命名规则一般如下:
由于JS中的变量是松散类型的,应避免出现无法表示所包含的数据类型的无用变量名。
有三种表示变量数据类型的方式: (选择其一使用,保证项目一致)
var found = false; // 布尔型
var count = 1; //数字
var name = ""; //字符串
var person = null; //对象
o表对象 s表字符串 i表整数 f表浮点数 b表布尔型 var bFound
var found /*:Boolean*/ = false;
var person /*:Object*/ = null;
只要应用的某一部分过于依赖另一部分,代码就是耦合过紧,难于维护。
1. 解耦HTML/JavaScript
直接写在HTML中的JavaScript,使用包含内联代码的<script>元素或者是使用HTML属性来分配事件处理程序,都是过于紧密的耦合。
<!--使用<script>的紧密耦合的HTML/JavaScript-->
<script type="text/javascript">
document.write("Hello World1");
</script>
<!--使用时间处理程序属性值的紧密耦合的HTML/JavaScript-->
<input type="button" value="Click me" onclick="doSomething()"/>
理想情况下,HTML和JavaScript应该完全分离,并通过外部文件和使用DOM附加行为来包含JS。
还有一种耦合情况是在JS中使用innerHTML方式动态插入元素到页面。一般,应避免在JS中创建大量HTML。一般可以在页面直接包含并隐藏标记,等到整个页面渲染好之后,用JS显示它,而非生成它。
如果不分离,调试可能会很麻烦,因为HTML是动态生成的,你可能在页面源码中不能找到。
2. 解耦CSS/JavaScript
最常见的紧密耦合的例子就是使用JS来更改样式
element.style.color = "red";
element.style.backgroundColor = "blue";
通过动态更改样式类而非特定样式能降低耦合。
3. 解耦应用逻辑/事件处理程序
function handleKeyPress(event){
event = EventUtil.getEvent(event);
if(event.keyCode == 13){
var target = EventUtil.getTarget(event);
var value = 5 * parseInt(target.value);
if(value > 10){
document.getElementById("error-msg").style.display = "block";
}
}
}
这个事件处理程序包含了应用逻辑和事件处理。问题:除了通过事件之外再也没有方法执行应用逻辑,让调试变得困难。
解决办法就是将应用逻辑和事件处理程序相分离。这两者分别处理各自的东西。一个事件处理程序应该从事件对象中提取相关信息,并将这些信息传递给处理应用逻辑的某个方法中。
function validateValue(value){
value = 5 * parseInt(target.value);
if(value > 10){
document.getElementById("error-msg").style.display = "block";
}
}
function handleKeyPress(event){
event = EventUtil.getEvent(event);
if(event.keyCode == 13){
var target = EventUtil.getTarget(event);
validateValue(target.value);
}
}
重构之后的代码可以在不附加到事件的情况下测试代码,更容易创建单元测试或自动化应用流程。
请牢记以下应用和业务逻辑之间松散耦合的原则:
找到相似用户。将一个用户与其他用户进行对比,找到相似的人。这里可以用距离表示,即找到距离最近的两个用户。
基于内存的协调过滤 计算行与行之间的相似度。
计算距离的算法有以下几种:
闵可夫斯基(将曼哈顿和欧几里得距离归纳成一个公式)
以上三种方式实现代码请访问: https://github.com/BubbleM/Python-Recommended/blob/master/recommend1.py
实现:
https://github.com/BubbleM/Python-Recommended/blob/master/recommend2.py
区别:
在数据完整“密集”的情况下使用曼哈顿和欧几里得距离效果最好。
当数据存在“分数膨胀”问题,使用皮尔逊相关系数效果最好。
在数据稀疏,非零值较总体要少得多的情况下使用余弦相似度效果最好。
K最邻近算法
如果只依靠最相似的一个用户来做推荐,这个用户有些特殊的偏好,会直接反映在推荐内容里。解决之一就是找寻多个相似的用户。
实现代码:
https://github.com/BubbleM/Python-Recommended/blob/master/recommend.py
基于用户的协调过滤的弊端:
只要能减少花费在作用域上的时间,就能增加脚本的整体性能。
function updateUI(){
var doc = document;
var imgs = doc.getElementsByTagName('img');
for(var i=0 , len=imgs.length;i<len;i++){
imgs[i].title = doc.title + "image" + i;
}
var msg = doc.getElementById("msg");
msg.innerHTML = "Update complete.";
}
以上函数包含了三个对于全局document对象的引用,如果页面上有多个图片,那么for循环中的document引用就会被执行多次甚至上百次,每次都会要进行作用域链查找。通过创建一个局部变量doc指向document对象,现在函数只有一次全局查找,要快很多。
避免with语句(在性能非常重要的地方必须避免使用with语句。和函数类似,with语句会创建自己的作用域,因此会增加其中执行的代码的作用域链的长度。)
选择正确方法(性能问题的一部分是和用于解决问题的算法或者方法有关的)
常见的算法类型
O(1) 常数 不管有多少值,执行的时间恒定。一般表示简单值和存储在变量中的值。
O(logn) 对数 总执行时间和值的数量有关,但是要完成算法不一定要获取每个值。如:二分查找
O(n) 线性 总执行时间和值数量直接相关。如:遍历某个数组中的所有元素
O(n^2) 平方 总执行时间和值的数量有关,每个值至少要获取n次。如:插入排序
使用变量和数组要比访问对象上的属性更有效率,后者是一个O(n)操作。
一个循环的基本优化步骤如下:
(1)减值迭代
大多数循环使用一个从0开始,增加到某个特定值的迭代器。在很多情况下,从最大值开始,再循环中不断减值的迭代器更加高效。
(2)简化终止条件
避免使用属性查找或其他O(n)的操作。
(3)简化循环体
(4)使用后测试循环
最常用的for和while都是前测试循环。do-while这种后测试循环,可以避免最初终止条件的计算,因此运行更快。
当循环的次数时确定的,消除循环并使用多次函数调用往往更快。如果循环的迭代次数不能事先确定,可以考虑使用一种叫做Duff装置的技术。
6个阶段:计划、需求分析、设计、程序编写、测试、运行和维护
项目规划阶段:负责整个测试阶段的监控。
需求分析阶段:确定测试需求分析,制定系统测试计划。
测试需求分析是指产品生存周期中测试所需的资源、配置、各阶段评审通过的标准等。
概要设计阶段和详细设计阶段:制定集成测试计划和单元测试计划。
编码阶段:开发相应的测试代码或测试脚本。
测试阶段:实施测试,并提交相应的测试报告。
软件测试过程V模型:明确地表明了测试的不同级别,清晰地展示了软件测试与开发之间的关系
软件测试过程W模型
测试环境=硬件+软件+网络+数据准备+测试工具
硬件环境:主要是指PC机、笔记本电脑、服务器、各种PDA终端等。
软件环境:主要是软件运行的操作系统。
网络环境:主要是指是C/S结构还是B/S结构。
数据准备:主要指的是测试数据的准备。考虑数据量和真实性。
测试工具:目前测试工具很多,可分为静态测试工具、动态测试工具、黑盒测试工具、白盒测试工具、测试执行评估工具、测试管理工具等。
所谓软件测试,就是一个过程或一系列过程,用来确认计算机代码完成了其应该完成的功能,不执行其不该有的操作。软件应当是可预测且稳定的,不会给用户带来意外惊奇。
软件测试是对软件需求分析、设计规格说明好编码的最终复审,是软件质量保证的关键步骤。
应该一开始就假设程序中隐藏着错误,然后测试程序,发现尽可能多的错误。测试是为发现错误而执行程序的过程。
应该在测试之前建立某些策略:黑盒测试和白盒测试是两种最普遍的策略。
黑盒测试:又称数据驱动的测试或输入\输出驱动的测试。使用这种测试方法时,将程序视为一个黑盒子。测试目标与程序的内部机制和结构完全无关,而是将重点集中放在发现程序不按其规范正确执行的环境条件。判定标准是“”穷举输入测试“”
白盒测试:又称逻辑驱动的测试。允许我们检查程序的内部结构。这种测试策略对程序的逻辑结构进行检查,从中获取测试数据,遗憾的是常忽略了程序的规范。判定标准是“”“穷举路径测试”
1.利用错误列表进行代码检查
2.小组代码走查
3.桌面检查
4.同行评审
代码检查与走查是两种主要的人工测试方法。 都要求人们组成一个小组来阅读或直观检查特点的程序。“”头脑风暴会“”的目标是找出错误来,但不必找出改正错误的方法。
代码走查的另一个优点是,一旦发现错误,通常就能在代码中对其进行精确定位,降低了调试的成本。
以组为单位阅读代码,它是一系列规程和错误检查技术的集合。
在检查进行时,主要进行两项活动:
1.由程序编码人员逐条语句讲述程序的逻辑结构。
2.对着历来常见的编码错误列表分析程序
用于代码检查的错误列表:
代码检查过程的一个重要部分就是对照一份错误列表,来检查程序是否存在常见错误。
1.数据引用错误
2.数据声明错误
3.运算错误
4.比较错误
5.控制流程错误
6.接口错误
7.输入\输出错误
与代码检查很相似,都是以小组为单位进行代码阅读,是一系列规程好错误检查技术的集合。而而走查会议的规程不同,不同于仅阅读程序或使用错误检查列表,代码走查的参与者“使用了计算机”。被指定为测试人员的那个人会带着一些书面的测试用例(程序或模块具有代表性的输入集及预期的输出集)来参与会议。作用是提供了启动代码走查和质疑程序员逻辑思路及其设想的手段。
人工查找错误的第三种过程是古老的桌面检查方法。桌面检查可以视为由单人进行的代码检查或代码走查:由一人阅读程序,对照错误列表检查程序,对程序推荐测试数据。
同行评分是一种依据程序整体质量,可维护性,可扩展性,易用性和清晰性对匿名程序进行评价的技术。目的是为程序员提供自我评价的手段,而非发现错误。
建议综合最多的测试方法来设计严格的程序测试,因为每一种测试方法都有其独特的优势和弱点。推荐的步骤是先使用黑盒测试方法来设计测试用例,然后视情况需要使用白盒测试方法来设计补充的测试用例。
标准化
要让所有的数据变得可用我们可以对其进行标准化,最常用的方法是将所有数据都转化为0到1之间的值。(将每个值减去最小值,并除以范围)
需要进行标准化的情形:
在如何海量的数据时代,如何从海量的商品中选择相关产品?在1100万首iTunes曲目中,肯定有一部分音乐是你特别喜爱的,那么该如何找到它们呢?
数据挖掘不仅仅是用来推荐商品,或是单单给商人增加销量,同时也能扩展我们的能力,让我们能够处理海量的数据,如让潘多拉音乐站提供个性化的音乐列表。
数据挖掘的重点在于找到数据中的模式。
利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。
协调过滤的实现的三步骤:收集数据——找到相似用户和物品——进行推荐
协调过滤,由于使用的是用户产生的各种数据,因此又称为社会化过滤算法。协调过滤算法倾向于推荐那些已经很流行的物品,这类推荐系统会让流行的物品更为流行,冷门的物品更无人问津。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.