概述
1.求众数
众数是获取一个特征属性的最准确的方式,它比先求均值后筛选数据要有效得多
double Find_Mod(vector<double>&theta)
{
vector<double>theta_(theta);
int n = theta.size();
sort(theta_.begin(),theta_.end());
int i = 0;
int MaxCount = 1;
int index = 0;
while (i < n)//遍历
{
int count = 1;
int j;
for (j = i; j < n - 1; j++)
{
if (theta[j] == theta[j + 1])//存在连续两个数相等,则众数+1
{
count++;
}
else
{
break;
}
}
if (MaxCount < count)
{
MaxCount = count;//当前最大众数
index = j;//当前众数标记位置
}
++j;
i = j;//位置后移到下一个未出现的数字
}
cout << theta[index] << " " << MaxCount << endl;
return theta[index];
}
后经过一些需要将代码做出如下优化:
//若输入数据为小数,则对原数组四舍五入存入新数组
for (int i = 0; i < theta.size(); ++i)
{
theta_.push_back(round(theta[i]));
}
//对新数组中的数据进行寻找,可实现小数数组寻找众数
if (theta_[j] == theta_[j + 1])//存在连续两个数相等,则众数+1
{
count++;
}
//若想将众数数据精度精确到小数位,可由如上优化得到数据后,统计原有数据与众数之间的误差
//给定一个阈值,对筛选过后的数据进行取平均操作,如:
double error=0;
double mean=0;
double t=0;
for(int i=0;i<theta_.size();++i)
{
error=abs(theta_[i]/mod-1);//mod为得到众数
if(error<0.2)
{
mean+=theta_[i];
t++;
}
}
mean/=t;
2.取平均
有时候进行数据处理,拿到的数据可靠性不是很好,需要在排序后进行剪枝,即剪掉最小值与最大值两侧的部分数据
double get_Mean(vector<double>&data)
{
int pruning = 0;
double mean_ = 0;
sort(data.begin(), data.end());
//剪枝
pruning = data.size() / 10;
int num = data.size() - pruning * 2;
mean_ = accumulate(data.begin() + pruning, data.end() - pruning, 0) / num;
//cout << "mean_area = " << mean_area << endl;
return mean_;
}
3.排序
C++中常用排序就STL中的sort,或者自己实现主流的一些排序算法:冒泡等
//升序排列
vector<double>data;
sort(data.begin(),data.end());
由于工作需要,归纳了一下类似于matlab中sortrow函数中的功能,对点坐标或者矩阵的某一行/列进行排序,得到排序后的点集,以下代码实现按照点集的x、y坐标分别进行排序
vector<Point> points_sort(vector<Point2f>&points, int flag)
{
double n = points.size();
vector<Point>result;
if (flag == 0)
{
double i, j, k;
double t, u;
for (i = 0; i < n - 1; ++i)
{
k = i;
for (j = i + 1; j < n; ++j)
{
if (points[k].x > points[j].x)
k = j;
}
if (k != i)
{
t = points[k].x;
points[k].x = points[i].x;
points[i].x = t;
u = points[k].y;
points[k].y = points[i].y;
points[i].y = u;
}
}
//将排序后的坐标点存放到一个新容器当中
for (int i = 0; i < n; i++)
result.push_back(points.at(i));
}
else if (flag == 1)
{
double i, j, k;
double t, u;
for (i = 0; i < n - 1; ++i)
{
k = i;
for (j = i + 1; j < n; ++j)
{
if (points[k].y > points[j].y)
k = j;
}
if (k != i)
{
t = points[k].y;
points[k].y = points[i].y;
points[i].y = t;
u = points[k].x;
points[k].x = points[i].x;
points[i].x = u;
}
}
//将排序后的坐标点存放到一个新容器当中
for (int i = 0; i < n; i++)
result.push_back(points.at(i));
}
return result;
}
4.排序求众数
//求众数,返回<众数个数,众数值>
vector<int> getMajorityEle(vector<int>& src_vect)
{
sort(src_vect.begin(), src_vect.begin());
vector<int> numSet;
vector<int> count;
numSet.push_back(src_vect[0]);
count.push_back(1);
int m = 0;
for (int i = 1; i < src_vect.size(); i++)
{
if (src_vect[i] != src_vect[i - 1])
{
numSet.push_back(src_vect[i]);
count.push_back(1);
m++;
}
else
{
count[m]++;
}
}
int max = count[0];
for (int i = 0; i < count.size(); i++)
{
if (max < count[i])
max = count[i];
}
vector<int> res;
res.push_back(max);
for (int i = 0; i < count.size(); i++)
{
if (count[i] == max)
res.push_back(numSet[i]);
continue;
}
return res;
}
后续有时间再补充一下其他经典排序算法,感兴趣的伙伴可以在评论区补充交流,谢谢查看
最后
以上就是爱笑皮带为你收集整理的C++数据处理之求众数+排序的全部内容,希望文章能够帮你解决C++数据处理之求众数+排序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复