tonglin0325的个人主页

ubuntu重启搜狗输入法

1
2
3
fcitx | xargs kill
sogou-qimpanel | xargs kill

 或者编写Shell脚本restart_sougou.sh,放到/usr/bin目录下,不要忘记chmod修改运行权限,然后就能在终端输入restart_sougou命令来执行重启搜狗输入法

1
2
3
4
5
6
#!/bin/sh
pidof fcitx | xargs kill
pidof sogou-qimpanel | xargs kill
nohup fcitx 1>/dev/null 2>/dev/null &
nohup sogou-qimpanel 1>/dev/null 2>/dev/null &

 

机器学习——支持向量机(SVM)之拉格朗日乘子法,KKT条件以及简化版SMO算法分析

SVM有很多实现,现在只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法,然后介绍如何使用一种核函数(kernel)的方式将SVM扩展到更多的数据集上。

 

1.基于最大间隔分隔数据

几个概念:

1.线性可分(linearly separable):对于图6-1中的圆形点和方形点,如果很容易就可以在图中画出一条直线将两组数据点分开,就称这组数据为线性可分数据

2.分隔超平面(separating hyperplane):将数据集分隔开来的直线称为分隔超平面

3.如果数据集是1024维的,那么就需要一个1023维的超平面来对数据进行分隔

4.间隔(margin):数据点到分隔面的距离称为间隔

5.支持向量(support vector):离分隔超平面最近的那些点

 

支持向量机的优点:泛化错误率低,计算开销不大,结果易解释

支持向量机的缺点:对参数调节核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题

适用数据类型:数值型和标称型数据**
**

 

2.寻找最大间隔

如何求解数据集的最佳分隔直线

分隔超平面的形式可以写成  

其中 w = (w1,w2,w3…wd)为法向量,决定了超平面的方向,其中d等于数据的维度,

全文 >>

广告系统——广告归因

1.广告归因的概念

在做用户增长的时候需要对各渠道(广告投放平台,如腾讯广告、字节-巨量引擎、百度营销平台等)上的投放效果进行广告归因,归因的作用是判断用户从何渠道下载应用(或打开落地页、小程序),通过匹配用户广告行为,分析是何原因促使用户产生转化。 广告归因的数据结果是衡量广告效果、评估渠道质量的重要依据,可帮助广告主合理优化广告素材,高效开展拉新、促活营销推广。

参考:神策广告归因介绍

2.常用的渠道

3.广告归因原理

1.用户A在app1上点击了app2在渠道方(各种投放平台,比如巨量引擎)投放的广告,这时候渠道方就知道用户A点击了广告

2.第三方归因平台(即下图中的服务端,比如字节穿山甲的增长参谋)会和很多的渠道方进行合作,渠道方支持将数据回传给第三方的归因平台,比如oaid,imei这种的用户ID,一般需要在渠道方的平台上进行配置,参考:appsflyer-巨量引擎广告归因配置 - Bytedance Ads Configuration

3.当用户首次打开APP的时候,会将埋点数据上报给第三方的归因平台(像穿山甲会提供SDK用于上传打点),一般也是在渠道方平台上进行配置,参考:归因结果兼容API使用说明:穿山甲

4.归因平台再将激活的数据回传给各个渠道方,用于优化投放的点击率(CTR)

5.归因平台完成渠道归因

6.上报数据到数据仓库中

7.app内部打点统计次留,播放,付费的时间,上报给归因平台

8.归因再将这些转化数据回传给各个渠道方,用于优化投放的转化率(CVR)

全文 >>

机器学习——Logistic回归

 

1.基于Logistic回归和Sigmoid函数的分类

 

2.基于最优化方法的最佳回归系数确定

 

2.1 梯度上升法

参考:机器学习——梯度下降算法

 

2.2 训练算法:使用梯度上升找到最佳参数

 

Logistic回归梯度上升优化算法

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
def loadDataSet():
dataMat = []; labelMat = []
fr = open('testSet.txt')
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #加上第0维特征值
labelMat.append(int(lineArr[2]))
return dataMat,labelMat #返回数据矩阵和标签向量

def sigmoid(inX):
return 1.0/(1+exp(-inX))

def gradAscent(dataMatIn, classLabels): #Logistic回归梯度上升优化算法
dataMatrix = mat(dataMatIn) #由列表转换成NumPy矩阵数据类型,dataMatrix是一个100×3的矩阵
labelMat = mat(classLabels).transpose() #由列表转换成NumPy矩阵数据类型,labelMat是一个100×1的矩阵
m,n = shape(dataMatrix) #shape函数取得矩阵的行数和列数,m=100,n=3
alpha = 0.001 #向目标移动的步长
maxCycles = 500 #迭代次数
weights = ones((n,1)) #3行1列的矩阵,这个矩阵为最佳的回归系数,和原来的100×3相乘,可以得到100×1的结果
for k in range(maxCycles):
h = sigmoid(dataMatrix*weights) #矩阵相乘,得到100×1的矩阵,即把dataMat的每一行的所有元素相加
error = (labelMat - h) #求出和目标向量之间的误差
#梯度下降算法
weights = weights + alpha * dataMatrix.transpose()* error #3×100的矩阵乘以100×1的矩阵,weights是梯度算子,总是指向函数值增长最快的方向
return weights #返回一组回归系数,确定了不同类别数据之间的分割线

 

1
2
3
dataMat,labelMat = loadDataSet()
print gradAscent(dataMat,labelMat) #输出回归系数

全文 >>

zk学习笔记——超级用户

如果遇到auth遗忘,又想删除zknode的情况,可以使用超级用户用来删除zknode

超级用户只能在zkserver启动的时候启用,需要在zkserver的启动命令中添加 -Dzookeeper.DigestAuthenticationProvider.superDigest 参数

 

1
2
-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs=

 然后就可以使用 super:admin 的auth来删除zknode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[zk: localhost:2181(CONNECTED) 15] addauth digest super:admin
[zk: localhost:2181(CONNECTED) 16] get /hbase

cZxid = 0x155e7a
ctime = Wed Oct 20 21:35:34 CST 2021
mZxid = 0x155e7a
mtime = Wed Oct 20 21:35:34 CST 2021
pZxid = 0x15639a
cversion = 40
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 12
[zk: localhost:2181(CONNECTED) 17] rmr /hbase

参考:zookeeper acl认证机制及dubbo、kafka集成、zooviewer/idea zk插件配置

 

机器学习——基于概率论的分类方法:朴素贝叶斯

1.基于贝叶斯决策理论的分类方法

2.使用朴素贝叶斯进行文档分类

 

使用Python进行文本分类

1.准备数据:从文本中构建词向量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def loadDataSet():
postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'],
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
classVec = [0,1,0,1,0,1] #1 is abusive, 0 not
return postingList,classVec #第一个变量是词条切分后的文档集合,取出标点,第二个变量是类别标签的集合

def createVocabList(dataSet): #创建一个包含在所有文档中出现的不重复词的列表
vocabSet = set([]) #生成一个空的集合
for document in dataSet:
vocabSet = vocabSet | set(document) #求两个集合的并集
return list(vocabSet)

def setOfWords2Vec(vocabList, inputSet):#输入参数为词汇表vocabList及某个文档inputSet,输出的是文档向量,即文档中的每个词在词汇表中出现的次数
returnVec = [0]*len(vocabList)
for word in inputSet:
if word in vocabList:
returnVec[vocabList.index(word)] = 1
else: print "the word: %s is not in my Vocabulary!" % word
return returnVec

 

1
2
3
4
5
6
7
8
9
listOPosts,listClasses = loadDataSet()
print "某个文档:"
print listOPosts[0]
myVocabList = createVocabList(listOPosts) #由词表生成向量
print "词汇表:"
print myVocabList
print "文档向量:"
print setOfWords2Vec(myVocabList,listOPosts[0])

 

1
2
3
4
5
6
7
某个文档:
['my', 'dog', 'has', 'flea', 'problems', 'help', 'please']
词汇表:
['cute', 'love', 'help', 'garbage', 'quit', 'I', 'problems', 'is', 'park', 'stop', 'flea', 'dalmation', 'licks', 'food', 'not', 'him', 'buying', 'posting', 'has', 'worthless', 'ate', 'to', 'maybe', 'please', 'dog', 'how', 'stupid', 'so', 'take', 'mr', 'steak', 'my']
文档向量:
[0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1]

 

2.训练算法:从词向量计算概率

 

全文 >>