离散化

数据处理----离散化

可紊 提交于 2020-04-04 09:47:28
离散化的定义:离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。(by百度百科) 为什么要离散化处理? 打个比方,某个题目告诉你有10^4个数,每个数大小不超过10^10,要你对这些数进行操作,需要开10^10的数组,当然这是不可能的,但是10^4的范围就完全没问题。 我们可以把这些数映射到一个新的数组中,只改变元素大小,但是不改变其相对大小。 所以离散化只能用在只考虑元素的相对大小,而不考虑元素本身的问题。 离散化操作用到了三个函数 sort, unique, lower_bound. 具体步骤看代码: #include<bits/stdc++.h> using namespace std; const int N=1E5+7; int arr1[N],arr2[N]; int rank[N];//离散化数组 int main(){ int n; cin>>n; for(int i=1;i<=n;i++) { cin>>arr1[i]; arr2[i]=arr1[i]; } sort(arr2+1,arr2+1+n);//首先对arr2排序 int len=unique(arr2+1,arr2+1+n)-arr2-1;//然后是去重以及去重后的大小 for(int i=1;i<=n;i++){ rank[i]=lower_bound(arr2+1

《模拟系统设计方法设计计算机控制系统》总结

冷暖自知 提交于 2020-03-21 18:22:34
一、一般的设计步骤 (1)在连续系统控制器与被控对象之间 插入保持器 ,比如零阶保持器ZOH,检查插入后的连续系统是否稳定,如不稳定,则 重新设计控制器D(s) (2)选择合适的方法 将D(s)离散化为D(z) (3)对G(s) = ZOH*H(s)离散化,D(s)和G(z)共同构成离散系统。此时检查离散系统的特性是否满足要求,如不满足就重新设计D(s) (4)用数字算法(编程)实现控制器D(z),即用差分方程表示D(z) 二、如何离散化D(s)为D(z) (1)数值积分法 - 基本思想 - A、前向矩形法   主要特性 【i】s域和z域为平移伸缩关系   由于 z = 1 + Ts,想当于将s域伸缩T倍,再向左平移1个单位长度; 【ii】不能保证z域的稳定性   上述映射关系带来的问题是即使D(s)在s域稳定(极点全位于s左半平面),D(z)在z域也不一定能稳定(极点位于单位圆内): 【iii】变换前后,稳态增益不变,即:   改进方法: 减小采样周期T (why?) B、后向矩形法   主要特性 【i】s域左半平面映射为z域的小圆 |z-1/2| 2 = 1 内部 【ii】 s域虚轴映射为z域的小圆 |z-1/2| 2 = 1 圆上 【iii】 s域右半平面映射为z域的小圆 |z-1/2| 2 = 1 外部 【iv】由上述三点,可知D(s)稳定,则D(z)一定稳定 【v

决策树(decision tree)(三)——连续值处理

核能气质少年 提交于 2020-02-29 02:48:28
决策树(decision tree)(三)——连续值处理 **注:本博客为周志华《机器学习》读书笔记,虽然有一些自己的理解,但是其中仍然有大量文字摘自周老师的《机器学习》书。 决策树系列博客: 决策树(decision tree)(一)——构造决策树方法 决策树(decision tree)(二)——剪枝 决策树(decision tree)(三)——连续值处理 决策树(decision tree)(四)缺失值处理 前面两篇博客分别介绍了如何构造决策树(根据信息增益,信息增益率,基尼指数等)和如何对决策树进行剪枝(预剪枝和后剪枝),但是前面两篇博客主要都是基于离散变量的,然而我们现实的机器学习任务中会遇到连续属性,这篇博客主要介绍决策树如何处理连续值。 | 连续值处理 因为连续属性的可取值数目不再有限,因此不能像前面处理离散属性枚举离散属性取值来对结点进行划分。因此需要连续属性离散化,常用的离散化策略是二分法,这个技术也是C4.5中采用的策略。下面来具体介绍下,如何采用二分法对连续属性离散化: 下面举个具体的例子,来看看到底是怎样划分的。给定数据集如下(数据集来自周志华《机器学习》,我已经把数据集放到github上了,地址为: 西瓜数据集3.0 ): 对于数据集中的属性“密度”,决策树开始学习时,根节点包含的17个训练样本在该属性上取值均不同。我们先把“密度”这些值从小到大排序:

离散化

荒凉一梦 提交于 2020-02-27 19:01:52
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如: 原数据:1,999,100000,15;处理后:1,3,4,2; 原数据:{100,200},{20,50000},{1,400}; 处理后:{3,4},{2,6},{1,5}; 有时候,我们要处理的数据范围非常大,但是数据量并不多,同时, 我们需要知道的只是他们的相对大小关系 ,这时候,我们就可以对数据进行离散化处理。 比如现在在x轴上有n(n<100)个点,分别给出他们的坐标m(m<1e9),询问你在坐标k左边的坐标数量有多少。 如果m小的话,我们完全可以使用桶排解决,但是m如果1e9的话,开数组肯定会炸( 不要问为什么不用map ,每一种算法肯定有他存在的意义),这时候我们就可以先对数据离散化。 现在有数据1 2 2 7 8 9 100 200 199999 1000000000 离散化有两种较常用的方法 第一种是将相等的数据离散化为相等的数据,上面的数据处理后的结果就是1 2 2 3 4 5 6 7 8 9 第二种是将相等的数据离散化为不相等的数据,上面的数据处理后的结果就是1 2 3 4 5 6 7 8 9 10 第一种,该方法用到unique()和lower_bound(), 因为不难理解,直接上代码 int n =

HihoCoder 1079 离散化

自作多情 提交于 2020-02-25 15:57:39
HihoCoder 1079 离散化 时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住。看到这个场景,小Hi便产生了这样的一个疑问——最后到底能有几张海报还能被看见呢? 于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作长度为L的一段区间,且有N张海报按照顺序依次贴在了宣传栏上,其中第i张海报贴住的范围可以用一段区间[a_i, b_i]表示,其中a_i, b_i均为属于[0, L]的整数,而一张海报能被看到当且仅当存在长度大于0的一部分没有被后来贴的海报所遮挡住。那么问题就来了:究竟有几张海报能被看到呢? 输入 每个测试点(输入文件)有且仅有一组测试数据。 每组测试数据的第1行为两个整数N和L,分别表示总共贴上的海报数量和宣传栏的宽度。 每组测试数据的第2-N+1行,按照贴上去的先后顺序,每行描述一张海报,其中第i+1行为两个整数a_i, b_i,表示第i张海报所贴的区间为[a_i, b_i]。 对于100%的数据,满足N<=10^5,L<=10^9,0<=a_i<b_i<=L。 输出

线段树区间更新 + 离散化 -- Mayor's posters POJ - 2528

自闭症网瘾萝莉.ら 提交于 2020-02-23 01:38:18
Mayor’s posters POJ - 2528 题意: n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围li 、ri(1<=li<=ri<=10000000)。求出最后还能看见多少张海报。 思路: 线段树区间更新题,可以用懒人更新的思路优化,对于线段树来说10000000显然太大,数组开不了,而n只有10000,就可以离散化一下。 但是离散化对本题来说有一个问题(坑), 就是由于我们是紧紧挨着压缩的, 所以可能会存在错误覆盖的问题 例如对于数据 3 1 10 1 3 7 10 我们压缩过后应该就变为 1 4 1 2 3 4 可这样的话我们目测一下, 就只有2个区间可以看到了, 第一个被盖住了. 而真正的答案应该是3才对 这是我们应该在离散化数组c中存储时考虑将每次的右边界r+1也存入, 这样就可以有效避免错误覆盖的问题。 问题code: # include <iostream> # include <stdio.h> # include <algorithm> using namespace std ; const int maxn = 1e5 + 5 ; int st [ maxn * 4 ] , vis [ maxn * 2 ] , cnt [ maxn * 2 ] , a [ maxn * 2 ] ; int ans ; void pushdown (

特征工程 - 特征变换

心不动则不痛 提交于 2020-02-19 04:06:43
特征工程 - 特征变换 案例1:特征二值化 – 图像二值化 下载cv2 !pip install --upgrade pip !pip install opencv-python 下载图片 !wget http://pic1.win4000.com/wallpaper/2018-12-10/5c0df6d577576.jpg !cp 5c0df6d577576.jpg nvshen.jpg Jupyter中显示图片 %matplotlibatplotlib inline import matplotlib.pyplot as plt import cv2 def show_img(img): if len(img.shape) == 3: b, g, r = cv2.split(img) img = cv2.merge([r, g, b]) plt.imshow(img) else: plt.imshow(img, cmap='gray') plt.axis("off") plt.show() image = cv2.imread("nvshen.jpg") show_img(image) 进行灰度化处理 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) show_img(gray_image) 二值化操作 ret,thr =

04_特征工程

自作多情 提交于 2020-02-18 14:46:31
1.Feature Scaling 对数据的自变量或特征范围进行标准化的一种方法。在数据处理中,它也称为数据规范化,通常在数据预处理步骤中执行。 为什么要进行Feature Scaling: 如果输入范围变化,在某些算法中,对象函数将不能正常工作。 梯度下降收敛得更快,与特征缩放完成。梯度下降法是逻辑回归、支持向量机、神经网络等常用的优化算法。 涉及距离计算的算法如KNN、聚类算法也受特征量的影响。只要考虑欧几里德距离是如何计算的:取观测值之间差异平方和的平方根。变量之间的尺度差异会对这个距离产生很大的影响。 基于树的算法几乎是唯一不受输入大小影响的算法,我们可以很容易地从树的构建方式中看到这一点。当决定如何分割时,树算法会查找“特征值是否为X>3.0”这样的决策,并计算分割后子节点的纯度,因此不考虑特征的规模。 如何进行Feature Scaling: 如果你的特征不是高斯分布,比如,有偏态分布或者有异常值,归一化标准化不是一个好的选择,因为它会将大多数数据压缩到一个很窄的范围内。然而,我们可以将特征转换成高斯like,然后使用归一化-标准化。特征变换将在3.4节中讨论 在进行距离或协方差计算(如聚类、PCA和LDA等算法)时,最好使用Normalization - Standardization ,因为它可以消除尺度对方差和协方差的影响。 Min-Max scale与规范化

【入门】离散化

老子叫甜甜 提交于 2020-02-12 16:22:57
离散化 首先,我们先了解一下什么是离散化。 离散化,是把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。 通俗地讲就是把减小数据的大小,但不改变数据的相对大小。 举个栗子[滑稽]: 9124551,51,-145661145,5611561。 这个数列离散化后就是: 4,2,1,3。 所以说,离散化是一个简单又实用的技巧,可以减少时间复杂度和空间复杂度。 当你做一道题目的数据规模很大的题,用平时的做法只能拿到部分分。但离散化的存在,我们就可以让一个效率不高的算法拿到一道题的部分分甚至直接 AC ! 但不过离散化并不是万能的,对于一些题目是没用的甚至会暴零! 所以一定要判断好能不能用离散化,并且看需不需要用离散化。 END 来源: https://www.cnblogs.com/luojunhang/p/12299449.html

Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长

混江龙づ霸主 提交于 2020-02-11 21:48:12
参考 https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include <algorithm> #define LEN 10000 using namespace std; struct Node { int left; int right; int count;//被覆盖次数 //所包含的区间数量,如三条[1,2],[2,3],[4,5]线段被覆盖,则line=2,因为 [1,2],[2,3]是连续的。 int line;//所包含的区间数量 int lbd;//左端点是否被覆盖 用来辅助对line的计算 int rbd;//右端点是否被覆盖 int m;//测度 ,即覆盖的区间长度,如[2,8]就为6 }node[LEN*4];; struct ScanLine { int x; int y1; int y2; int flag; }scan[LEN];; int y[LEN]; void build(int l, int r, int i) { node[i].left = l; node[i].right = r; node[i].count = 0; node[i].m = 0; node[i].line = 0; if (r - l > 1) { int