导航:首页 > 解决方法 > 数据分布不均匀解决方法

数据分布不均匀解决方法

发布时间:2022-12-09 10:54:48

A. excel插入折线图,X轴的数据不均匀

1、绘制曲线。在excel中,根据对应数据列出x、y两行数据,全部选中这两行数据,点击“图表向导”(或者在菜单栏中“插入”—“图表”),在“标准类型”中选“xy散点图”—“平滑线散点图”或者“折线散点图”,在随后出现的对话框中“数据区域”中选择“系列产生在”:“行”或者“列”;在“系列”中选择x值和y值的区域,再按提示一步一步完成数据对应的曲线图。
默认情况下是“系列产生在”:“行”;x值为上面一行、y值为下面一行。所以如果罗列数据时x值在第一行,对应的y值在第二行的话,基本上可以不用选择:系列产生在行或者列,也不用选择x值和y值的区域,直接点“下一步”就可完成。
2、拟合趋势线。选中绘好的曲线,按右键,选择“添加趋势线”,在“类型”中选择与这条曲线最近似的类型,如:线性、对数、多项式等(其中的一个),再在这个“添加趋势线”选框中点“选项”,勾选“显示公式”和“显示R平方值”这两项,确定后趋势线做成。这时检查R平方值是否接近1,如果R平方值是1或者0.995左右(并且趋势线与绘制的曲线基本重合),表示拟合的趋势线和显示的公式基本能表示数据的对应关系。但如果R平方值跟1相比相差很大(或者趋势线与绘制的曲线大相径庭),就需要重新选“添加趋势线”中“类型”,重新拟合直到R平方值接近1(一定要选所有趋势线类型中R平方值最接近1且趋势线与绘制的曲线基本重合的那个)。
如果不能找到这样一条拟合趋势线,只能证明那些数据不能被拟合成一条回归曲线(或者说拟合的效果不好,不能较好地反映数据的变化),这是因为不是所有的任何一组数据都能找到一条完美的与之相配的回归线。
况且数据本身如果不是由函数直接得出(大多数情况应该都不是)的话,拟合得出的方程或曲线都只是一种趋势、估算(而不是一种真实值),在预测、统计方面的作用应该要大些。

B. 数据分析,分布不均匀的数据应该怎么样处理

根据业务知识,剔除异常值,也不知道你的数据是啥样的,什么领域的?
我们做这种大数据量的,一般都是分出很多段,然后每段的数据取均值,再建回归模型。

C. php的memcached分布式hash算法,如何解决分布不均crc32这个算法没办法把key值均匀的分布出去

memcached的总结和分布式一致性hash
当前很多大型的web系统为了减轻数据库服务器负载,会采用memchached作为缓存系统以提高响应速度。
目录: (http://hounwang.com/lesson.html)
memchached简介
hash
取模
一致性hash
虚拟节点
源码解析
参考资料
1. memchached简介
memcached是一个开源的高性能分布式内存对象缓存系统。
其实思想还是比较简单的,实现包括server端(memcached开源项目一般只单指server端)和client端两部分:
server端本质是一个in-memory key-value store,通过在内存中维护一个大的hashmap用来存储小块的任意数据,对外通过统一的简单接口(memcached protocol)来提供操作。
client端是一个library,负责处理memcached protocol的网络通信细节,与memcached server通信,针对各种语言的不同实现分装了易用的API实现了与不同语言平台的集成。
web系统则通过client库来使用memcached进行对象缓存。
2. hash
memcached的分布式主要体现在client端,对于server端,仅仅是部署多个memcached server组成集群,每个server独自维护自己的数据(互相之间没有任何通信),通过daemon监听端口等待client端的请求。
而在client端,通过一致的hash算法,将要存储的数据分布到某个特定的server上进行存储,后续读取查询使用同样的hash算法即可定位。
client端可以采用各种hash算法来定位server:
取模
最简单的hash算法
targetServer = serverList[hash(key) % serverList.size]
直接用key的hash值(计算key的hash值的方法可以自由选择,比如算法CRC32、MD5,甚至本地hash系统,如java的hashcode)模上server总数来定位目标server。这种算法不仅简单,而且具有不错的随机分布特性。
但是问题也很明显,server总数不能轻易变化。因为如果增加/减少memcached server的数量,对原先存储的所有key的后续查询都将定位到别的server上,导致所有的cache都不能被命中而失效。
一致性hash
为了解决这个问题,需要采用一致性hash算法(consistent hash)
相对于取模的算法,一致性hash算法除了计算key的hash值外,还会计算每个server对应的hash值,然后将这些hash值映射到一个有限的值域上(比如0~2^32)。通过寻找hash值大于hash(key)的最小server作为存储该key数据的目标server。如果找不到,则直接把具有最小hash值的server作为目标server。
为了方便理解,可以把这个有限值域理解成一个环,值顺时针递增。
如上图所示,集群中一共有5个memcached server,已通过server的hash值分布到环中。
如果现在有一个写入cache的请求,首先计算x=hash(key),映射到环中,然后从x顺时针查找,把找到的第一个server作为目标server来存储cache,如果超过了2^32仍然找不到,则命中第一个server。比如x的值介于A~B之间,那么命中的server节点应该是B节点
可以看到,通过这种算法,对于同一个key,存储和后续的查询都会定位到同一个memcached server上。
那么它是怎么解决增/删server导致的cache不能命中的问题呢?
假设,现在增加一个server F,如下图
此时,cache不能命中的问题仍然存在,但是只存在于B~F之间的位置(由C变成了F),其他位置(包括F~C)的cache的命中不受影响(删除server的情况类似)。尽管仍然有cache不能命中的存在,但是相对于取模的方式已经大幅减少了不能命中的cache数量。
虚拟节点
但是,这种算法相对于取模方式也有一个缺陷:当server数量很少时,很可能他们在环中的分布不是特别均匀,进而导致cache不能均匀分布到所有的server上。
如图,一共有3台server – 1,2,4。命中4的几率远远高于1和2。
为解决这个问题,需要使用虚拟节点的思想:为每个物理节点(server)在环上分配100~200个点,这样环上的节点较多,就能抑制分布不均匀。
当为cache定位目标server时,如果定位到虚拟节点上,就表示cache真正的存储位置是在该虚拟节点代表的实际物理server上。
另外,如果每个实际server的负载能力不同,可以赋予不同的权重,根据权重分配不同数量的虚拟节点。
// 采用有序map来模拟环
this.consistentBuckets = new TreeMap();
MessageDigest md5 = MD5.get();//用MD5来计算key和server的hash值
// 计算总权重
if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )
this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];
} else if ( this.weights == null ) {
this.totalWeight = this.servers.length;
}
// 为每个server分配虚拟节点
for ( int i = 0; i < servers.length; i++ ) {
// 计算当前server的权重
int thisWeight = 1;
if ( this.weights != null && this.weights[i] != null )
thisWeight = this.weights[i];
// factor用来控制每个server分配的虚拟节点数量
// 权重都相同时,factor=40
// 权重不同时,factor=40*server总数*该server权重所占的百分比
// 总的来说,权重越大,factor越大,可以分配越多的虚拟节点
double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );
for ( long j = 0; j < factor; j++ ) {
// 每个server有factor个hash值
// 使用server的域名或IP加上编号来计算hash值
// 比如server - "172.45.155.25:11111"就有factor个数据用来生成hash值:
// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor
byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );
// 每个hash值生成4个虚拟节点
for ( int h = 0 ; h < 4; h++ ) {
Long k =
((long)(d[3+h*4]&0xFF) << 24)
| ((long)(d[2+h*4]&0xFF) << 16)
| ((long)(d[1+h*4]&0xFF) << 8 )
| ((long)(d[0+h*4]&0xFF));
// 在环上保存节点
consistentBuckets.put( k, servers[i] );
}
}
// 每个server一共分配4*factor个虚拟节点
}
// 采用有序map来模拟环
this.consistentBuckets = new TreeMap();
MessageDigest md5 = MD5.get();//用MD5来计算key和server的hash值
// 计算总权重
if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )
this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];
} else if ( this.weights == null ) {
this.totalWeight = this.servers.length;
}
// 为每个server分配虚拟节点
for ( int i = 0; i < servers.length; i++ ) {
// 计算当前server的权重
int thisWeight = 1;
if ( this.weights != null && this.weights[i] != null )
thisWeight = this.weights[i];
// factor用来控制每个server分配的虚拟节点数量
// 权重都相同时,factor=40
// 权重不同时,factor=40*server总数*该server权重所占的百分比
// 总的来说,权重越大,factor越大,可以分配越多的虚拟节点
double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );
for ( long j = 0; j < factor; j++ ) {
// 每个server有factor个hash值
// 使用server的域名或IP加上编号来计算hash值
// 比如server - "172.45.155.25:11111"就有factor个数据用来生成hash值:
// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor
byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );
// 每个hash值生成4个虚拟节点
for ( int h = 0 ; h < 4; h++ ) {
Long k =
((long)(d[3+h*4]&0xFF) << 24)
| ((long)(d[2+h*4]&0xFF) << 16)
| ((long)(d[1+h*4]&0xFF) << 8 )
| ((long)(d[0+h*4]&0xFF));
// 在环上保存节点
consistentBuckets.put( k, servers[i] );
}
}
// 每个server一共分配4*factor个虚拟节点
}
// 用MD5来计算key的hash值
MessageDigest md5 = MD5.get();
md5.reset();
md5.update( key.getBytes() );
byte[] bKey = md5.digest();

// 取MD5值的低32位作为key的hash值
long hv = ((long)(bKey[3]&0xFF) << 24) | ((long)(bKey[2]&0xFF) << 16) | ((long)(bKey[1]&0xFF) << 8 ) | (long)(bKey[0]&0xFF);

// hv的tailMap的第一个虚拟节点对应的即是目标server
SortedMap tmap = this.consistentBuckets.tailMap( hv );
return ( tmap.isEmpty() ) ? this.consistentBuckets.firstKey() : tmap.firstKey();
更多问题到问题求助专区(http://bbs.hounwang.com/)

D. 如何处理数据不平衡问题

基于上一篇文章,面试被虐成渣,所以来整理和记录下第一个问题,关于数据不平衡的问题。

以下内容参考:

https://www.cnblogs.com/charlotte77/p/10455900.html                                                                     https://www.leiphone.com/news/201706/dTRE5ow9qBVLkZSY.html

数据不平衡也可称作数据倾斜。在实际应用中,数据集的样本特别是分类问题上,不同标签的样本比例很可能是不均衡的。因此,如果直接使用算法训练进行分类,训练效果可能会很差。

解决实际应用中数据不平衡问题可以从三个方面入手,分别是对数据进行处理、选择合适的评估方法和使用合适的算法。

1)过采样:

    主动获取更多的比例少的样本数据。由于样本比例不均衡,在条件允许的情况下可以尝试获取占比少的类型的样本数据。(PS:这就是为什么我几乎没有遇到过数据不平衡的问题。每次测试使用的数据集都尽可能的完美均衡) 也可以通过使用 重复 、 自举 或 合成 少数类过采样等方法(SMOTE)来生成新的稀有样品。

    直接简单复制重复的话,如果特征少,会导致过拟合的问题。经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本 (数据增强)。

2)欠采样:

    数据量足够时,可以通过保留比例小的样本数据和减少比例大的样本数据来平衡数据集。缺点是会丢失多数类中的一些重要信息。

3)改变权重:

    对不同样本数量的类别赋予不同的权重(通常会设置为与样本量成反比)

4)使用K-fold交叉验证

    值得注意的是,使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么在过度采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。

    K-fold交叉验证就是把原始数据随机分成K个部分,在这K个部分中选择一个作为测试数据,剩余的K-1个作为训练数据。交叉验证的过程实际上是将实验重复做K次,每次实验都从K个部分中选择一个不同的部分作为测试数据,剩余的数据作为训练数据进行实验,最后把得到的K个实验结果平均。

    此外,还应注意训练集和测试集的样本的概率分布问题。若实际数据不平衡,将采样平衡后的数据集作为训练集训练后,模型应用在测试集上效果仍会不好。因此,实际应用中尽可能 保持训练和测试的样本的概率分布是一致的。

1)谨慎选择AUC作为评价指标:对于数据极端不平衡时,可以观察观察不同算法在同一份数据下的训练结果的precision和recall,这样做有两个好处,一是可以了解不同算法对于数据的敏感程度,二是可以明确采取哪种评价指标更合适。针对机器学习中的数据不平衡问题,建议更多PR(Precision-Recall曲线),而非ROC曲线,具体原因画图即可得知,如果采用ROC曲线来作为评价指标,很容易因为AUC值高而忽略实际对少量样本的效果其实并不理想的情况。

2)不要只看Accuracy:Accuracy可以说是最模糊的一个指标了,因为这个指标高可能压根就不能代表业务的效果好,在实际生产中更关注precision/recall/mAP等具体的指标,具体侧重那个指标,得结合实际情况看。

1)选择对数据倾斜相对不敏感的算法。如树模型等。

2)集成学习。即多模型Bagging。首先从多数类中独立随机抽取出若干子集,将每个子集与少数类数据联合起来训练生成多个基分类器,再加权组成新的分类器,如加法模型、Adaboost、随机森林等。

3)转化成异常检测或者一分类问题。(具体内容后续有时间再跟进学习)

补充:什么是数据增强(Data Augmentation)?

参考链接:https://www.jianshu.com/p/3e9f4812abbc

数据增强让有限的数据产生更多的数据,增加训练样本的数量以及多样性(噪声数据), 提升模型鲁棒性, 一般用于训练集。神经网络需要大量的参数,许许多多的神经网路的参数都是数以百万计,而使得这些参数可以正确工作则需要大量的数据进行训练,但在很多实际的项目中,我们难以找到充足的数据来完成任务。随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力。

数据增强方法:

例如,我们可以对图像进行不同方式的裁剪,让物体以不同的实例出现在图像的不同位置,这同样能够降低模型对目标位置的敏感性。此外,调整亮度、对比度、饱和度和色调 等因素来降低模型对色彩的敏感度。再有,随机裁剪、随机反转、随机对比度增强、颜色变化等等。一般来讲随机反转和一个小比例的random resize,再接随机裁剪比较常用。NLP中将字和词连接起来就形成了一个新样本,也属于数据增强。

数据增强的分类:

数据增强可以分为两类,一类是离线增强,一类是在线增强。

· 离线增强 : 直接对数据集进行处理,数据的数目会变成增强因子乘以原数据集的数目,这种方法常常用于数据集很小的时候。

· 在线增强 : 这种增强的方法用于,获得批量(batch)数据之后,然后对这个批量(batch)的数据进行增强,如旋转、平移、翻折等相应的变化,由于有些数据集不能接受线性级别的增长,这种方法长用于大的数据集,很多机器学习框架已经支持了这种数据增强方式,并且可以使用 GPU 优化计算。

E. 如何解决机器学习中数据不平衡问题

首先,数据集不平衡会造成怎样的问题呢。一般的学习器都有下面的两个假设:一个是使得学习器的准确率最高,另外一个是学习器应该用在与训练集有相同分布的
测试集上。如果数据不平衡,那么学习器使得它的准确率最高肯定是更偏向于预测结果为比例更大的类别。比如说阳性的比例为1%,阴性的比例为99%,很明显
的是即使不学习,直接预测所有结果为阴性,这样做的准确率也能够达到99%,而如果建立学习器也很有可能没有办法达到99%。这就是数据比例不平衡所造成
的问题。这样建立的模型即使准确率再高,在实际应用的时候效果肯定不好,而且也不是我们想要的模型。

明白了数据集的不平衡对于学习过程所造成的问题,相应的解决办法也有不少。下面是一些常用的两类方法。
1 从数据集入手。既然数据不平衡,那我们就人为的把数据集给平衡一下。可以通过随机采样比例大的类别使得训练集中大类的个数与小类相当,也可以重复小类
使得小类的个数与大类相当。前者的问题是可能会丢失信息,因为只采用部分样本。后者的问题是可能造成过拟合,因为有重复样本。前者的问题可以通过
esemble的方法来解决,即每次形成训练集的时候包括所有小类样本,同时从大类样本中随机选择样本构成训练集,这样重复很多次得到很多训练集和训练模
型。在测试的时候使用投票的方法来判断分类结果。
除了平衡数据集外,还可以通过分别在大类和小类中筛选特征,然后组合起来构成学习器。这样也可能提高效果。

2 从学习器入手。最简单的是通过改变判断类别的cutoff来改变类别样本比例;也可以只学习一个类别。此外,在学习的时候考虑到误判不同样本的不同成本,使得学习器更偏向于预测小类。这样也能够改进模型。

F. 如果数据分布不均匀,怎么优化二分查找算法

楼主是不是想求出一个最小半径的圆,圆内包含所有的点?这个问题很有趣。

寻找这个圆的时候注意一下几点:
1.这个圆必然穿过图中某些靠外围的点,这样才是最小半径的圆。
2.几何中我们知道,三个点可以确定一个圆, 我们就是需要找出这三个点来.

算法如下:1.先求这些点对应的凸包,已经有现成的算法。
2.生成凸包后,在看凸包上哪三点确定的圆可以包含凸包。

当然如果楼主讨论的不是以上所述,而是模式分类的话,建议看看数据分类方法。可以搜索关键字:Gaussian mixtrual model, expectation-maximization algorithm 和 k-mean algorithm 学习下相关的知识。

G. 分布不均匀怎么进行快速排序

1.首先设定一个分界值,通过该分界值将数组分成左右两部分。
2.将大于或等于分界值的数据放到数组右边,小于分界值的放到数组左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据,分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据同样做类似的处理。
4.重复上述过程,可以看出这是一个递归定义。通过递归将左边部分排序好,再将右边部分排序好,这样整个数组都排序完成了。

H. Excel 图表中X轴数据分布不是均匀的怎么办

I. Excel 图表中X轴数据分布不是均匀的怎么办

解决的方法和详细的操作步骤如下:

1、第一步,选择Excel表,然后双击以将其打开,见下图,转到下面的步骤。

阅读全文

与数据分布不均匀解决方法相关的资料

热点内容
疤痕妊娠怎么治疗方法 浏览:964
旅游心理学研究的主要方法有 浏览:557
如何用简单方法制作生根水 浏览:831
宝宝不拉大便有什么好方法 浏览:727
染发黑色的正确方法和步骤 浏览:892
施工安全带使用方法 浏览:930
顽固口臭的治疗方法 浏览:819
爪爪机的使用方法 浏览:284
坐月子疼痛正确方法 浏览:462
量内衣的正确方法图片 浏览:993
量角器的使用方法视频 浏览:675
如何改善屁股两边冰凉的方法 浏览:596
山东济南肿瘤医院癌症治疗方法 浏览:38
教你如何做冰激凌简单的方法 浏览:867
骨关节炎检查方法有哪些 浏览:769
取小标题的方法技巧 浏览:976
电动扳手的使用方法 浏览:440
rosien水光针使用方法 浏览:492
电焊检测尺的使用方法 浏览:64
炒田螺简单好吃的方法 浏览:781