飘

海の上で最も自由なのは海賊王だぁ~


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签
  • High一下

Algorithms

发表于 2017-04-18

这里面的代码需要能够熟练写出。

ACM在线模板

dp总结

阅读全文 »

学习清单

发表于 2017-04-17

网上找的大数据工程师技能图谱,参照学习
职场机器学习入门

阅读全文 »

C++数值范围

发表于 2017-04-17   |   分类于 C++

C++各数据类型的取值范围

阅读全文 »

操作系统

发表于 2017-04-13   |   分类于 操作系统
《操作系统真象还原》相关笔记
https://www.cnblogs.com/20135223heweiqin/p/5444617.html
阅读全文 »

C++知识点

发表于 2017-04-08   |   分类于 C++

Function

设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

阅读全文 »

并发

发表于 2017-03-23

记录并发相关知识点

内存模型

Java线程-工作内存-内存操作-主内存

每个Java线程都有自己对应的工作内存,工作内存线程私有,必须通过主内存进行数据交换。

内存间交互操作

主内存和工作内存之间有具体的交互协议,实现从主内存到交互内存的拷贝和同步。有lock,unlock,read,load,use,assign,store,write。规定了一系列的访问规则。

volatile关键字

  • 可见性:一个线程对volatile修饰的变量修改之后,立刻对其它线程可见。但是,有些运算可能并非原子的,不能保证并发安全。使用情况需要满足:
    • 运算结果并不依赖变量的当前值,或者能够确保只有单一线程能够修改变量的值。
    • 变量不需要与其它的状态共同参与不变性约束。
  • 禁止语义重排
    • 相当于添加了内存屏障

内存模型特性

  • 对于long和double类型需要注意JVM对64数据是否为原子的
  • 原子性:synchronized关键字
  • 可见性:volatile synchronized final关键字实现
  • 有序性:volatile

happen-before原则

Java内存模型下有一些天然的先行发生关系:

  • 程序次序规则
  • 管程锁定规则
  • volatile规则
  • 线程启动规则
  • 线程终止规则
  • 线程中断规则
  • 对象终结规则
  • 传递性

Java线程实现

  • 线程实现
    • 内核级线程
      • 一般通过轻量级进程包装内核线程,然后再使用
      • 轻量级进程和线程之间1:1
      • 由于需要在用户态和内核态之间切换,系统调用代价较高
    • 用户线程
      • 线程建立,同步,销毁,调度完全在用户态中完成。
      • 进程和线程之比为1:N
    • 用户线程加轻量级线程
      • 混合使用,进程和线程之间N:M
  • Java线程实现
    • 1.2之前是用户线程
    • 1.2之后是基于操作系统原生线程来实现的
  • Java线程调度
    • 协同式线程调度:线程执行完通知其它线程执行
      • 好处是实现简单
      • 坏处是线程执行时间不可控制,如果一个线程编写有问题,容易造成阻塞。
    • 抢占式线程调度
      • 每个线程由系统来分配执行时间。
  • 线程状态转换
    • 新建
    • 运行:包括系统线程中的Running和Ready,有可能在等待CPU调度
    • 无限期等待:需要等待被其它线程唤醒。
      • 没有设置TimeOut的Object.wait()
      • 没有设置TimeOut的Thread.join()
      • LockSupport.park()
    • 有限期等待:一定时间之后被系统自动唤醒
      • Thread.sleep()
      • 设置TimeOut的Object.wait()
      • 设置TimeOut的Thread.join()
      • LockSupport.parkNanos()
      • LockSupport.parkUntil()
    • 阻塞:等待获得排它锁,在等待另一个线程释放锁时发生。
    • 结束

线程安全

  • 定义
    • 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步,或者在调用代码代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的。
  • 特征
    • 代码本身封装了所有必要的正确性保障手段
  • Java操作共享数据分类(线程安全程度由强到弱)
    • 不可变
      • String,Long,Double,BigInteger等为不可变对象
      • AtomicInteger和AtomiLong则为可变类
    • 绝对线程安全
      • java.util.Vector,方法被synchronized修
    • 相对线程安全:特定的执行顺序需要同步
      • Vector,HashTable,Collections
    • 线程兼容:对象本身是线程非线程安全的,但是可以使用同步手段让对象在并发情况下安全使用。
    • 线程对立:无法同步的代码。
  • 线程安全的实现
    • 互斥同步
      • 可以使用临界区,互斥量,和信号量、
      • synchronized关键字,Java里面会在同步块前后加上monitorenter和monitorexist关键字,重量级操作
      • ReentrantLock和synchronized很相似,写法上不太同
        • 等待可中断
        • 可实现公平锁
        • 锁绑定多个条件
    • 非阻塞同步
      • 基于冲突检测和乐观并发策略,先操作,有冲突,再补偿,需要硬件指令支持。
      • Test-and-set,Fetch-and-Increment,Swap,Compare-and-Swap(CAS),Load-Linked/Store-Conditional
    • 无同步方案
      • 可重入代码
      • 线程本地存储
  • 锁优化(1.5到1.6)
    • 适应性自旋
      • 自旋锁,多处理器上,一个线程请求资源被上锁,可以占用CPU自旋(忙循环),避免线程切换。
      • 适应性自旋意味着自旋时间不是固定的,由前一次在同一个锁上的自旋时间及锁拥有者的状态来决定。
    • 锁消除
      • 对不可能存在数据竞争的代码进行锁消除
    • 锁粗化
      • 如果虚拟机探测到一连串的对象都涉及到一个锁,可以将锁扩展到这个操作序列的外部。
    • 轻量级锁
      • 传统锁使用互斥量来实现
      • 轻量级锁通过CAS,对象头信息中的锁标志位实现。如果存在竞争关系,轻量级锁会膨胀为重量级锁。
    • 偏向锁
      • 消除数据在无竞争情况下的同步原语。

MySQL锁

锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性、有效性;锁冲突也是影响数据库并发访问性能的一个重要因素。锁是Mysql在服务器层和存储引擎层的的并发控制。

加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否是否已解除、释放锁等。

设计模式

详解java设计模式

Semphore

限制线程并发的数量

Exchanger

在两个线程之间传输数据

Tensorflow常用函数

发表于 2017-03-20   |   分类于 DL

Referrence

Tensorflow常用函数说明
Tensorflow入门教程合集
图解TensorFlow
TensorFlow博客资源
Tensorflow学习资料

阅读全文 »

智能算法

发表于 2017-03-17   |   分类于 Algorithm

PSO

​ 粒子群算法(Particle Swarm Optimization)是在仿真生物群体社会活动的基础上,通过模拟群体生物相互协同寻优能力,从而构造出的一种新的智能优化算法。它具有易理解、易实现、全局搜索能力强、收敛速度快、设置参数少等优点,在科学研究和工程领域都受到了广泛的应用。

原理

​ 在粒子群优化算法中,每个优化问题的潜在解都是搜索空间中的一只鸟,称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值,每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。优化开始时先初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个极值来更新自己。第一个极值就是整个种群目前找到的最优解。这个极值是全局最优解。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是全局最优解。第二个极值是粒子本身所找到的最优解,称为个体极值。这是因为粒子仅仅通过跟踪全局极值或者局部极值来更新位置,不可能总是获得较好的解。这样在优化过程中,粒子在追随全局极值或局部极值的同时追随个体极值则圆满的解决了这个问题。

实现

粒子群优化算法具有编程简单,易实现的特点。下面给出其实现的具体步骤:

步骤1:初始化。初始搜索点的位置X0i及其速度V0i通常是在允许的范围内随机产生的,每个粒子的Pbest坐标设置为其当前位置,且计算出其相应的个体极值(即个体极值点的适应度值),而整个邻域的最优粒子就是该粒子邻域中个体极值中最好的,记录该最好值的粒子序号,并将Nbesti设置为该最好粒子的当前位置。

步骤2:评价每一个粒子。计算粒子的适应度值,如果好于该粒子当前的个体极值,则将Pbest设置为该粒子的位置,且更新个体极值。如果在该粒子的邻域内所有粒子的个体极值中最好的好于当前的Nbesti,则将Nbesti设置为该粒子的位置,记录该粒子的序号,且更新Nbesti的函数值。

步骤3:粒子的更新。用式(2.1)和式(2.2)对每一个粒子的速度和位置进行更新。

步骤4:检验是否符合结束条件。如果当前的迭代次数达到了预先设定的最大次数(或达到最小错误要求),则停止迭代,输出最优解,否则转到步骤2。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/*
* File: GA_Minimal.cpp
* Author: GonewithGt
*
*/
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstdint>
#include <cassert>
#include <algorithm>
#include <iomanip>
#define POP_SIZE (100)
#define Genius (20)
#define MAX_GENR (100000)
#define MUT_CHANCE (10)
#define GENE_TYPE double
#define GENE_SIZE (sizeof(GENE_TYPE))
//#define GENE_MASK (GENE_SIZE/2)
using namespace std;
typedef struct {
GENE_TYPE gene;
GENE_TYPE gene2;
double fitness;
} individual;
individual population[POP_SIZE];
//GENE_TYPE mutRate = MUT_CHANCE;
double function2(double x){
double tmp=0.;
for(int j=1;j<=5;j++)
{
tmp=j*1.0*cos((j+1)*x*1.0+j)+tmp;
}
return tmp;
}
double fitnessFunction2(GENE_TYPE x) {
if (x > 1e-8)
return function2(x);
//return x * x * log(x);
return 0.; // limit of above function around 0
}
void recombine2(GENE_TYPE p1, GENE_TYPE p2, GENE_TYPE *c1, GENE_TYPE *c2) {
assert(sizeof(uint64_t) == sizeof(GENE_TYPE));
int cpoint = rand() % (GENE_SIZE * 8) + 1;
uint64_t mask = (1UL << cpoint) - 1;
*(uint64_t *)(c1) = *(uint64_t *)(&p1) & (mask);
*(uint64_t *)(c1) |= *(uint64_t *)(&p2) & (mask);
*(uint64_t *)(c2) = *(uint64_t *)(&p2) & (mask);
*(uint64_t *)(c2) |= *(uint64_t *)(&p1) & (mask);
}
void mutate2(GENE_TYPE * c1, GENE_TYPE * c2) {
*c1 = rand()*20./RAND_MAX-10.;
*c2 = rand()*20./RAND_MAX-10.;
}
bool ValueCmp2(individual const & a, individual const & b) {
return a.fitness < b.fitness;
}
/*
* MinimalGA uygulamasi ana fonksiyonu
*/
int main(int argc, char** argv) {
//freopen("Uva673.in","r",stdin);
freopen("test26.out","w",stdout);
cout<<"Generic 2"<<endl;
int i, j;
GENE_TYPE parent1, parent2, parent21, parent22;
GENE_TYPE child1, child2, child21, child22;
srand(time(0));
//cout << "Basit Genetik Algoritma Uygulamasi" << endl;
//cout << "Uyumluluk fonksiyonu : Some exponential stuff" <<GENE_SIZE<< endl;
cout << "Population Size : " << POP_SIZE << endl;
cout << "Max Generation: " << MAX_GENR << endl;
cout << "Genius: " << Genius << endl;
//cout << "Mutasyon olasiligi : " << MUT_CHANCE << endl;
for (i = 0; i < POP_SIZE; i++) {
//population[i].gene = (rand() % 100 - 50) / 50.;
population[i].gene = rand()*20./RAND_MAX-10.;
population[i].gene2 = rand()*20./RAND_MAX-10.;
population[i].fitness = fitnessFunction2(population[i].gene)*fitnessFunction2(population[i].gene2);
}
sort(population, population + POP_SIZE, ValueCmp2);
i = 0;
while( i < MAX_GENR) {
for (j = Genius; j < POP_SIZE-Genius; j += 2) {
parent1 = population[j].gene;
parent2 = population[j + 1].gene;
if (j < rand()%POP_SIZE)
mutate2(&child1, &child2);
else
recombine2(parent1, parent2, &child1, &child2);
population[j].gene = child1;
population[j + 1].gene = child2;
parent21 = population[j].gene2;
parent22 = population[j + 1].gene2;
if (j < rand()%POP_SIZE)
mutate2(&child21, &child22);
else
recombine2(parent21, parent22, &child21, &child22);
population[j].gene2 = child21;
population[j + 1].gene2 = child22;
}
for (j = POP_SIZE-Genius; j < POP_SIZE-10; j += 2) {
parent1 = population[j-(POP_SIZE-Genius)].gene;
parent2 = population[j + 1-(POP_SIZE-Genius)].gene;
if (j < rand()%POP_SIZE)
mutate2(&child1, &child2);
else
recombine2(parent1, parent2, &child1, &child2);
population[j].gene = child1;
population[j + 1].gene = child2;
parent21 = population[j].gene2;
parent22 = population[j + 1].gene2;
if (rand()%POP_SIZE<0.3*POP_SIZE)
mutate2(&child21, &child22);
else
recombine2(parent21, parent22, &child21, &child22);
population[j].gene2 = child21;
population[j + 1].gene2 = child22;
}
for (j = POP_SIZE-10; j < POP_SIZE; j += 2) {
parent1 = population[j-(POP_SIZE-10)].gene;
parent2 = population[j + 1-(POP_SIZE-10)].gene;
if (j < rand()%POP_SIZE)
mutate2(&child1, &child2);
else
recombine2(parent1, parent2, &child1, &child2);
population[j].gene = child1;
population[j + 1].gene = child2;
//parent21 = population[j].gene2;
//parent22 = population[j + 1].gene2;
//if (rand()%POP_SIZE<0.3*POP_SIZE)
// mutate2(&child21, &child22);
//else
// recombine2(parent21, parent22, &child21, &child22);
//population[j].gene2 = child21;
// population[j + 1].gene2 = child22;
}
for(j = 0; j < POP_SIZE; j++)
population[j].fitness = fitnessFunction2(population[j].gene)*fitnessFunction2(population[j].gene2);
sort(population, population + POP_SIZE, ValueCmp2);
//mutRate *= 0.9999;
//if(abs(population[0].fitness) < 1e-8 || abs(population[1].fitness) < 1e-8)
// break;
cout<<"The "<<i<<"th generation:"<<endl;
for(int k=0;k<20;k++){
cout<<setprecision(9)<<" x"<<k<<1<<"="<<population[k].gene<<" x"<<k<<2<<"="<<population[k].gene2<<" y="<<population[k].fitness<<endl;
}
i++;
}
//int minIndex = (population[0].fitness > population[1].fitness) ? 1 : 0;
//cout << "An effective gen : " << population[minIndex].gene << endl;
//cout << "Minimal fitness : " << population[minIndex].fitness << endl;
// cin.get();
return 0;
}

JVM

发表于 2017-03-09

​ 记录JVM相关知识点

阅读全文 »

深度学习的应用

发表于 2017-02-28

QA

QA问句解析的七种方法及优化思路

NER

Named Entity Recognition

Recurrent neural networks for Chinese named entity recognition in TensorFlow

Relation Extraction

Chinese Relation Extraction by biGRU

Deep Learning In Alibaba

阿里-搜索团队智能内容生成实践

深度学习的应用系列

word2vec代码

Query-Title

Pair-wise算法

DSSM & Multi-view DSSM TensorFlow实现

深度语义匹配模型-DSSM 及其变种

文本分析

  • 文本分类
    • 基于语义向量距离:将文本按照语义映射成高维的向量特征,通过向量距离来分类
    • 基于文本关键词、主题:首先提取文本关键词、主题等信息,然后通过这些词语的对照关系来进行分类
  • 文本打标签
  • 文本情感分析
  • 文本关键词抽取
    • TF-IDF
    • LDA
    • 基于Graph:将每个词与相关连的词构成图的结构
  • 文本摘要
    • 关键句抽取
    • 解析原文主谓宾,基于语义自动生成
  • 文本相似度分析
    • 文本语义向量化,详细
    • 通过向量距离判断文本的语义距离

推荐系统

SCENE-一个可扩展两层级新闻推荐系统

深度学习在推荐领域的应用:Lookalike 算法

PaddlePaddle提供的模型

models 简介

深度学习101:包括个性化推荐,情感分析,语义角色标注,机器翻译等

Word2Vec

  • CBOW
  • Skip-gram
  • Huffuman
  • Negative Sampling

文本分类

  • CNN
  • RNN
  • LSTM
  • 栈式双向LSTM
  • 双层序列的文本分类:对于长文本,可以将文本分为多个序列,对每个序列用卷积、池化提取特征,再进行分类。

点击率预估

广告展示步骤

  • 获取与用户搜索词相关的广告集合
  • 业务规则和相关性过滤
  • 根据拍卖机制和 CTR 排序
  • 展出广告

发展阶段

  • Logistic Regression(LR) / GBDT + 特征工程
  • LR + DNN 特征
  • DNN + 特征工程
  • Google广告点击预估

Wide & Deep Learning

谷歌在 16 年提出,将稀疏特征和Dense Embedding分别用LR和DNN结合在一起。

排序学习(Learning to Rank)

  • Pointwise 方法

Pointwise方法是通过近似为回归问题解决排序问题,输入的单条样本为得分-文档,将每个查询-文档对的相关性得分作为实数分数或者序数分数,使得单个查询-文档对作为样本点(Pointwise的由来),训练排序模型。预测时候对于指定输入,给出查询-文档对的相关性得分。

  • Pairwise方法(RankNet)

Pairwise方法是通过近似为分类问题解决排序问题,输入的单条样本为标签-文档对。对于一次查询的多个结果文档,组合任意两个文档形成文档对作为输入样本。即学习一个二分类器,对输入的一对文档对AB(Pairwise的由来),根据A相关性是否比B好,二分类器给出分类标签1或0。对所有文档对进行分类,就可以得到一组偏序关系,从而构造文档全集的排序关系。该类方法的原理是对给定的文档全集SS,降低排序中的逆序文档对的个数来降低排序错误,从而达到优化排序结果的目的。

  • Listwise方法(LambdaRank)

Listwise方法是直接优化排序列表,输入为单条样本为一个文档排列。通过构造合适的度量函数衡量当前文档排序和最优排序差值,优化度量函数得到排序模型。由于度量函数很多具有非连续性的性质,优化困难。

深度结构化语义模型 (Deep Structured Semantic Models, DSSM)

​ DSSM使用DNN模型在一个连续的语义空间中学习文本低纬的表示向量,并且建模两个句子间的语义相似度。本例演示如何使用PaddlePaddle实现一个通用的DSSM 模型,用于建模两个字符串间的语义相似度,模型实现支持通用的数据格式,用户替换数据便可以在真实场景中使用该模型。

命名实体识别

  • 序列标注可以分为Sequence Classification、Segment Classification和Temporal Classification三类
1234
GonewithGt

GonewithGt

Everything is good now~

38 日志
8 分类
27 标签
RSS
Github Email
© 2015 - 2018 GonewithGt
由 Hexo 强力驱动
主题 - NexT.Pisces
全站共 字