C++数据处理之求众数+排序

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;
}

后续有时间再补充一下其他经典排序算法,感兴趣的伙伴可以在评论区补充交流,谢谢查看

猜你喜欢

转载自blog.csdn.net/yohnyang/article/details/121875016#comments_25797071
今日推荐