算法

半监督学习

人盡茶涼 提交于 2020-01-22 21:08:59
下面这篇文章摘自 Liqizhou 的随笔,我觉得它非常清楚地概述了半监督学习,值得收藏。 原文地址:http://www.cnblogs.com/liqizhou/archive/2012/05/11/2496155.html 最近的一段时间一直在学习半监督学习算法,目前,国内的南京大学周志华老师是这方面的泰斗,写了很多这方面牛的文章,可以参考一下他的主页: http://cs.nju.edu.cn/zhouzh/ 。在国内的学术界周老师一直是我比较钦佩的人之一。下面贴出来的文章出自周老师之手,通俗易懂。受益匪浅。。 1. 引言 在传统的监督学习中,学习器通过对大量有标记的(labeled)训练例进行学习,从而建立模型用于预测未见示例的标记。这里的“标记”(label)是指示例所对应的输出,在分类问题中标记就是示例的类别,而在回归问题中标记就是示例所对应的实值输出。随着数据收集和存储技术的飞速发展,收集大量未标记的(unlabeled)示例已相当容易,而获取大量有标记的示例则相对较为困难,因为获得这些标记可能需要耗费大量的人力物力。例如在计算机辅助医学图像分析中,可以从医院获得大量的医学图像作为训练例,但如果要求医学专家把这些图像中的病灶都标识出来,则往往是不现实的。事实上,在真实世界问题中通常存在大量的未标记示例,但有标记示例则比较少,尤其是在一些在线应用中这一问题更加突出

ACM道路之一:基础算法(快速排序)

删除回忆录丶 提交于 2020-01-22 21:03:31
快速排序(qsort) 本质是分治思想 排序的一次划分算法从两头交替搜索,直到low和high重合,因此其时间复杂度是O(n);而整个快速排序算法的时间复杂度与划分的趟数有关。 快速排序三个步骤 1、确定区域,左边界(l),右边界(r),基准值(x = l+r>>2) 2、保证区间内,x左侧的任意值小于x,x右侧的任意值大于x 双头指针:i,j 分别从左边界、右边界向中间移动,下标为i的值大于x时,指针i停止移动,j同理 此时(i,j均停止移动,表明 q[i]>x&&q[j]<y) 交换两个值 swap(q[i],q[j]); 3、递归完成小区间的排序(l,j)(j+1,r) 给定你一个长度为n的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有整数均在1~ 10 9 109范围内),表示整个数列。 输出格式 输出共一行,包含 n 个整数,表示排好序的数列。 数据范围 1 ≤ n ≤ 100000 1≤n≤100000 输入样例: 5 3 1 2 4 5 输出样例: 1 2 3 4 5 解法1:直接利用[algorithm]头文件中的sort()函数完成排序 #include<bits/stdc++.h> using namespace std; const int N

事件抽取与事理图谱(一)

馋奶兔 提交于 2020-01-22 20:18:53
事件抽取是信息抽取研究中最具挑战性的任务之一,其主要研究如何从非结构化自然语言文本中抽取出事件的基本信息,例如事件的类型,事件的参与者,发生时间和地点等,并以结构化的形式呈现出来。 一些信息抽取领域的国际评测会议针对事件抽取提出了一系列的理论,并推出了一些实用的系统框架: 事件,作为信息的一种表现形式,其定义为特定的人、物在特定时间和特定地点相互作用的客观事实,一般来说是句子级的。 组成事件的各元素包括: 例句:在Baghdad,当一个美国坦克对着 Palestine 酒店开火时一个摄影师死去了。 根据上述定义,事件抽取任务可以分成两个子任务,分别是: 事件触发词及类型的识别(基于单词的多分类任务) 事件元素的识别(基于词对的多分类任务,是一种角色关系识别) 例如,对文本“Intel在中国成立了研究中心”进行事件抽取: 第一步应该将“成立”识别成触发词,其触发了一个“成立机构”类型的事件; 第二步应该将“Intel”、“中国”和“研究中心”识别成事件元素,其角色分别为“设立方”、“地点”和“被成立机构” 表示一个动作的发生或状态的变化,往往由动词驱动,也可以由能表示动作的名词等其他词性的词来触发,它包括参与该动作行为的主要成分 ( 如时间、地点、人物等) 。 包括一类核心事件或活动以及所有与之直接相关的事件和活动,可以由多个元事件片段组成。 当前主要是面对元事件抽取

python进阶-算法

谁都会走 提交于 2020-01-22 20:16:46
算法:解决问题的方法和步骤 评价算法的好坏:渐近时间复杂度和渐近空间复杂度。 渐近时间复杂度的大O标记: - 常量时间复杂度 - 布隆过滤器 / 哈希存储 - 对数时间复杂度 - 折半查找(二分查找) - 线性时间复杂度 - 顺序查找 / 桶排序 - 对数线性时间复杂度 - 高级排序算法(归并排序、快速排序) - 平方时间复杂度 - 简单排序算法(选择排序、插入排序、冒泡排序) - 立方时间复杂度 - Floyd算法 / 矩阵乘法运算 - 几何级数时间复杂度 - 汉诺塔 - 阶乘时间复杂度 - 旅行经销商问题 - NP 排序算法(选择、冒泡和归并)和查找算法(顺序和折半) 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 函数: def select_sort(origin_items, comp=lambda x, y: x < y): """简单选择排序""" items = origin_items[:] for i in range(len(items) - 1): min_index = i for j in range(i + 1, len(items)): if

数据结构-排序: 两路归并排序算法 - 子逸 - 博客园

社会主义新天地 提交于 2020-01-22 20:08:43
数据结构-排序: 两路归并排序算法 - 子逸 - 博客园 数据结构-排序: 两路归并排序算法 归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。 1、算法基本思路  设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。 (1)合并过程  合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区的起始位置。合并时依次比较R[i]和R[j]的关键字,取关键字较小的记录复制到R1[p]中,然后将被复制记录的指针i或j加1,以及指向复制位置的指针p加1。  重复这一过程直至两个输入的子文件有一个已全部复制完毕(不妨称其为空),此时将另一非空的子文件中剩余记录依次复制到R1中即可。 (2)动态申请R1  实现时,R1是动态申请的,因为申请的空间可能很大,故须加入申请空间是否成功的处理。 2、归并算法 void Merge(SeqList R,int low,int m,int high) {//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的 //子文件R[low..high] int i=low,j=m+1,p=0; //置初始值

数据结构_顺序列表_插入算法

别等时光非礼了梦想. 提交于 2020-01-22 19:34:28
数据结构之顺序列表之插入算法 关于这个,只怪自己寒假里无法完全集中精力,看老九军的这一节网课重复看了三天,才弄清了些东西。 对于刚开始接触编程的初学者,这里要引入一个索引下标以及位置的概念 但是在这里不多介绍,可自行百度。 顺序表的插入算法实现的步骤 判断插入的索引index是否合法。 比如index是否小于0,是否超出了容器规定的最大范围。 判断容器内的元素是否已满。 判断插入的索引index是否在容器长度之内。 从下标为index的元素开始,每个元素往右移动一个位置。 表长度length+1。(容易忘记的地方) C++代码 # pragma once constexpr auto MAX_SIZE = 255 ; //定义容器的最大容量; # include <iostream> using namespace std ; typedef struct { int id ; char * name ; } ElementType ; //数据元素 typedef struct { ElementType datas [ MAX_SIZE ] ; int length ; } SeqList ; //定义顺序列表 void InsertElement ( SeqList * seqlist , int index , ElementType element ) //插入算法 {

浅谈程序优化

荒凉一梦 提交于 2020-01-22 19:15:24
   当初在学校实验室的时候,常常写一个算法,让程序跑着四处去晃荡一下回来,结果也就出来了。可工作后,算法效率似乎重要多了,毕竟得真枪实弹放到产品中,卖给客户的;很多时候,还要搞到嵌入式设备里实时地跑,这么一来真是压力山大了 ~~~ 。这期间,对于程序优化也算略知皮毛,下面就针对这个问题讲讲。   首先说明一下,这里说的程序优化是指程序效率的优化。一般来说,程序优化主要是以下三个步骤:    1. 算法优化    2. 代码优化    3. 指令优化 算法优化   算法上的优化是必须首要考虑的,也是最重要的一步。一般我们需要分析算法的时间复杂度,即处理时间与输入数据规模的一个量级关系,一个优秀的算法可以将算法复杂度降低若干量级,那么同样的实现,其平均耗时一般会比其他复杂度高的算法少(这里不代表任意输入都更快)。   比如说排序算法,快速排序的时间复杂度为O(nlogn),而插入排序的时间复杂度为O(n*n),那么在统计意义下,快速排序会比插入排序快,而且随着输入序列长度n的增加,两者耗时相差会越来越大。但是,假如输入数据本身就已经是升序(或降序),那么实际运行下来,快速排序会更慢。   因此,实现同样的功能,优先选择时间复杂度低的算法。比如对图像进行二维可分的高斯卷积,图像尺寸为MxN,卷积核尺寸为PxQ,那么     直接按卷积的定义计算,时间复杂度为O(MNPQ)    

JAVA经典算法(二十八)

空扰寡人 提交于 2020-01-22 15:00:08
题目:对10个数进行排序 这里利用的是冒泡排序实现的 package cn.ls.lanqiao; import java.util.*; public class Test28 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int t; int[] nums = new int[n]; for (int i = 0; i < nums.length; i++) { nums[i] = sc.nextInt(); } for (int i = 0; i < nums.length - 1; i++) { for (int j = 0; j < nums.length - 1 - i; j++) { if (nums[j] > nums[j + 1]) { t = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = t; } } } // System.out.println(Arrays.toString(nums)); for (int i = 0; i < nums.length; i++) { System.out.print(nums[i] + " "); } } } 来源: