Android性能优化——电池使用优化

为什么要做电量优化

Android应用开发中,需要考虑的情况是,如何优化电量使用,让我们的app不会因为电量消耗过高被用户排斥,或者被其他安全应用报告。

什么样的行为会导致电量损耗过高

对于移动设备而言,有以下几种行为会导致设备电量的消耗增加
1.屏幕保持开启状态
2.蜂窝网络的频繁启动与关闭

如何观测我们的应用电量使用情况

可以先使用以下adb命令,生成我们应用的电量使用情况txt

从电脑拔出手机,操作一会我们的目标app,再接上电脑

然后再去[……]

Read more

Android性能优化——内存优化

Android内存分配机制的问题

Java提供了完善的垃圾回收机制,让程序员不用关心回收内存问题,但是在实际使用中,还是会出现内存回收不完全的问题。这时候android系统看到了内存使用居高不下,就会不断的增加分配内存,最后导致整个应用卡顿或者死掉。

产生这类问题的原因

由于java拥有gc机制,按道理来说,这样的内存泄露是不会发生的,但是为什么还是会产生这样的现象呢?因为我们的引用被一个已经不可访问的对象持有,导致gc无法正确识别,所以产生了内存泄露。

如何避免

这里主要运用三个android sdk提供的工具来寻找和诊断

Memory moniter——实时监测应用内存的分配和[……]

Read more

Android性能优化——图像绘制与布局

Android的图像绘制

在Android中,呈现界面的重要方式就是图像,而绘制图像的工作更是非常重要,这个重要的工作是谁在处理呢?那就是我们的GPU。但是GPU的资源是有限的,当我们的绘制任务过多的时候,就会使系统的图像绘制变慢,用户的体验就会是应用很卡,或者感觉到丢帧。

图像绘制过度的原因

图像绘制过度的原因主要有几种

1.绘制的东西太多了
2.反复绘制的次数过多

图像绘制性能优化

1.针对绘制过多的问题,我们可以反复检查自己的界面,去掉一些或者合并一些不必要/重复的东西

2.针对绘制次数过多,我们可以借助安卓手机的开发者模式中的过度绘制选项,查看哪一部分的图形过度绘制,再去[……]

Read more

[W10]大数据学习

大数据学习

我的学习算法有时候会面对大数据的考验,我们需要做一些优化才能保证速度

随机梯度下降

传统的梯度下降法每次会遍历整个集合,效率较低,随机梯度下降不必每次都遍历,效率较高
首先引入几个公式

算法步骤

1.随机排序数据集合
2.遍历随机的数据,使用如下公式进行学习

迷你梯度下降法

迷你梯度下降是一个折中的办法,不像梯度下降每次使用全部,也不是只使用一个数据。
迷你梯度下降一次只使用少量数据,一般范围是2-100
公式如下

随机梯度下降的收敛

我们怎么判断什么样的下降率a是合适的?我们如何确定已经到达了全局最优解的点?

我们可以每隔1000[……]

Read more

[W9]异常检测

异常检测动机

当我们有新的数据样本的时候,我们希望通过一个模型p(x)以及一个门槛值ϵ来判定这个样本是否是异常的。

高斯分布

高斯分布是一种可以被描述为%e9%ab%98%e6%96%af%e5%88%86%e5%b8%83%e5%85%ac%e5%bc%8f的类钟型线。
具体公式是

%e9%ab%98%e6%96%af%e5%88%86%e5%b8%83%e6%a8%a1%e5%9e%8b
其中几个参数的计算如下
u%e8%ae%a1%e7%ae%97

%e7%ac%ac%e4%ba%8c%e5%8f%82%e6%95%b0%e8%ae%a1%e7%ae%97

普遍公式

只有公式部分不同,其余部分均与高斯分布相同

%e6%99%ae%e9%81%8d%e5%85%ac%e5%bc%8f

异常检测vs监督学习

何时使用异常检测
正样本较少,负样本多,正样本不够训练,且种类太多
何时使用监督学习
有大量的正负样本,我们有足够的正样本来训练,未来的正样本与现有的类似

推荐系统

推荐系统的目的是为了给用户推荐产品
这里有几个定义
nu 用户数量
nm 电影(产品)数量
r(i,[……]

Read more

[W8]聚集

非监督学习:介绍

非监督学习和监督学习相反,是一种无标签学习。
换而言之,我们不知道y的具体分类。
非监督学习适用于:
1.市场分割
2.社交网络分析
3.组织电脑集群
4.天文数据分析

K-Means算法

K-Means算法是最广泛应用的自动分类算法。
具体过程如下
1.随机在数据集合中初始化两个点,叫做聚类中心
2.将整个集合分为两个子集,一个是对于中心1较近的点,一个是对中心2较近的点
3.将划分好的集合中的点求出一个平均值,把聚类中心移到这个点
4.重复2和3过程

优化算法

随机赋值

我们的算法有时会在局部最优解停留,我们需要做的是重复随机赋值几次,来确保取到全局最优解。[……]

Read more

[W7]支持向量机SVM

SVM支持向量机

支持向量机是一种监督学习算法,有时比现有算法更加简洁高效。
回顾一下逻辑回归的代价函数

%e9%80%bb%e8%be%91%e5%9b%9e%e5%bd%92%e4%bb%a3%e4%bb%b7%e5%87%bd%e6%95%b0%e5%b1%95%e5%bc%80
注意展开后的第一项
%e5%b1%95%e5%bc%80%e5%90%8e%e7%ac%ac%e4%b8%80%e9%a1%b9
当 θTx远远大于1的时候,此项接近于0
当 θTx远远小于1的时候,我们可以用一条直线来替代sigmoid曲线,最终图形如下
%e4%bc%98%e5%8c%96%e7%ac%ac%e4%b8%80%e9%a1%b9
对于第二项,我们的标尺是-1
小于等于-1的时候是0,大于等于-1的时候是一条直线,如下图
%e4%bc%98%e5%8c%96%e7%ac%ac%e4%ba%8c%e9%a1%b9

KernelsI

Kernels 允许我们在SVM上创建复杂的,非线性的算法
给出一个x,可以通过计算其与地标l1,l2,l3的相似度来选取是否增加为新的特征域
例如,高斯kernel如下

[……]

Read more

[W6]机器学习应用建议

采取什么措施来进一步优化

主要有五种措施
1.获取更多训练样本
2.尝试使用更小规模的特称
3.尝试增加特征
4.尝试使用多项式特征
5.增加或者减小正则参数λ

评估假设

我们如何评估一个已经做出的假设是否合理呢?也许我们的假设在训练集合上面有较好的表现,但是对于其他的数据却表现得不好。

这时候我们需要使用一些方法来评估我们的假设是否合理。
首先,我们需要把训练样本分为两部分,训练集合和测试集合
接着做如下步骤:
1.使用训练集合训练参数集合Θ 以及最小化Jtrain(Θ)
2.使用测试集合运算误差Jtrain(Θ)

测试集合误差计算

1.对于线性回归问题,按照如下公式

[……]

Read more

[W5]神经网络的学习

代价函数

首先需要定义几个变量
L = 这个神经网络的总层数
sl= 第L层的单元数量
K = 输出层的单元数量
在神经网络中,我们的输出节点不止一个,我们用hΘ(x)k 来表示第k个输出
还记得逻辑回归的代价函数吗?

逻辑回归代价
对于神经网络来说,代价函数更加复杂一些
%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c%e4%bb%a3%e4%bb%b7%e5%87%bd%e6%95%b0

反向传播算法

反向传播算法是一种用于最小化代价函数的算法,正如我们在逻辑回归问题中使用的梯度下降算法一样。
引入一个新概念,error,

%e5%8f%8d%e5%90%91%e4%bc%a0%e6%92%aderror
代表了第l层第j个节点的误差值。
对于输出节点来说,我们可以通过下面公式计算error
%e8%be%93%e5%87%ba%e8%8a%82%e7%82%b9%e7%9a%84error
对于输出层之外的节点误差,我们可以用下面公式来计算
%e9%9d%9e%e8%be%93%e5%87%ba%e5%b1%82%e8%af%af%e5%b7%ae%e8%ae%a1%e7%ae%97[……]

Read more

[W4]神经网络的表示

非线性假设

前面我们提到过线性假设,我们可以理解为在这种情况下,我们的函数在平面上的图形是一条直线
而非线性假设的函数表达,并非直线,其中一个例子如下

qq%e6%88%aa%e5%9b%be20161121100237

我们大脑中的神经元

在我们大脑中,有许多叫做神经元的神奇的小东西,它有多个输入,多个输出,一个个的联结起来,构成了我们的神经系统。
神经网络算法为什么叫这个名字也是收到了这个东西的启发。

神经网络的表示

神经网络主要分三个层次,输入,中间,输出
一个简单的例子如下

qq%e6%88%aa%e5%9b%be20161121101842
那么,中间层(隐藏层)是怎样从输入层获取的呢?
见下图
qq%e6%88%aa%e5%9b%be20161121105609
其中Θ表示第几层,第几个参数,例如,(1)第一层,11第一行第一个参数,以此[……]

Read more