求平均数问题

还有人用VB6吗 2012-03-28 09:21:07
一系列数据,其中有几个异常数据干扰,影响平均数大小,怎么剔除该数据?
下列数据中需要 剔除 3.42 3.82 4.6
1.4
3.42
1.46
1.46
1.48
1.45
1.45
3.82
1.48
1.46
4.6
1.45
1.49
1.49
1.5
...全文
225 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
apples20008 2012-04-08
  • 打赏
  • 举报
回复
中误差计算方法:1、例如有n个数字,先计算平均值
2、求每个数字与平均值的差值
3、所有差值的平方相加,再除以n,然后开方
还有人用VB6吗 2012-04-07
  • 打赏
  • 举报
回复
中误差怎么计算的?
贝隆 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
标准的统计算法,是先求样本数学期望和标准离差(西格玛),然后对采样逐个检验,将偏离 n 倍西格玛的剔除。

n 是你预先设定的阈值。

但这样做的精度,受样本大小的影响。样本太小时,或异常数据太多时就不理想。
[/Quote]
的确需要很多样本
of123 2012-03-29
  • 打赏
  • 举报
回复
标准的统计算法,是先求样本数学期望和标准离差(西格玛),然后对采样逐个检验,将偏离 n 倍西格玛的剔除。

n 是你预先设定的阈值。

但这样做的精度,受样本大小的影响。样本太小时,或异常数据太多时就不理想。
apples20008 2012-03-29
  • 打赏
  • 举报
回复
这是在测绘学上经常用到的
apples20008 2012-03-29
  • 打赏
  • 举报
回复
数值 平均值 真误差 真误差的平方 中误差 ABS(真误差/中误差)
3.04 3.2591 -0.2191 0.04800481 0.47776 0.458598459
2.98 -0.2791 0.07789681 0.47776 0.584184528
3.07 -0.1891 0.03575881 0.47776 0.395805425
3.22 -0.0391 0.00152881 0.47776 0.081840255
3.44 0.1809 0.03272481 0.47776 0.378641996
3.14 -0.1191 0.01418481 0.47776 0.249288346
3.06 -0.1991 0.03964081 0.47776 0.416736437
4.03 0.7709 0.59428681 0.47776 1.613571668
3.06 -0.1991 0.03964081 0.47776 0.416736437
3.14 -0.1191 0.01418481 0.47776 0.249288346
2.96 -0.2991 0.08946081 0.47776 0.626046551
4.03 0.7709 0.59428681 0.47776 1.613571668
3.09 -0.1691 0.02859481 0.47776 0.353943403
3.06 -0.1991 0.03964081 0.47776 0.416736437
2.98 -0.2791 0.07789681 0.47776 0.584184528
3.05 -0.2091 0.04372281 0.47776 0.437667448
3.04 -0.2191 0.04800481 0.47776 0.458598459
3.03 -0.2291 0.05248681 0.47776 0.479529471
4.94 1.6809 2.82542481 0.47776 3.518293704
3.04 -0.2191 0.04800481 0.47776 0.458598459
3.04 -0.2191 0.04800481 0.47776 0.458598459
apples20008 2012-03-29
  • 打赏
  • 举报
回复
18楼正解。可使用中误差理论,见http://wenku.baidu.com/view/3663fa43a8956bec0975e399.html。先剔除真误差是2倍以上中误差的数值(粗差),再计算剩下的数值,再剔除之
数值 平均值 真误差 真误差的平方 中误差 ABS(真误差/中误差)
3.04 3.2591 -0.2191 0.04800481 0.47776 0.458598459
2.98 -0.2791 0.07789681 0.47776 0.584184528
3.07 -0.1891 0.03575881 0.47776 0.395805425
3.22 -0.0391 0.00152881 0.47776 0.081840255
3.44 0.1809 0.03272481 0.47776 0.378641996
3.14 -0.1191 0.01418481 0.47776 0.249288346
3.06 -0.1991 0.03964081 0.47776 0.416736437
4.03 0.7709 0.59428681 0.47776 1.613571668
3.06 -0.1991 0.03964081 0.47776 0.416736437
3.14 -0.1191 0.01418481 0.47776 0.249288346
2.96 -0.2991 0.08946081 0.47776 0.626046551
4.03 0.7709 0.59428681 0.47776 1.613571668
3.09 -0.1691 0.02859481 0.47776 0.353943403
3.06 -0.1991 0.03964081 0.47776 0.416736437
2.98 -0.2791 0.07789681 0.47776 0.584184528
3.05 -0.2091 0.04372281 0.47776 0.437667448
3.04 -0.2191 0.04800481 0.47776 0.458598459
3.03 -0.2291 0.05248681 0.47776 0.479529471
4.94 1.6809 2.82542481 0.47776 3.518293704
3.04 -0.2191 0.04800481 0.47776 0.458598459
3.04 -0.2191 0.04800481 0.47776 0.458598459
还有人用VB6吗 2012-03-28
  • 打赏
  • 举报
回复
四位数法有人明白不?
Tiger_Zhao 2012-03-28
  • 打赏
  • 举报
回复
总要限定一些规则的,比如你 5楼的数据,采用 C 方案,M=3.06,
> M*2 无法排除,
> M+0.5 可以排除,这个就是你必须预先确立的规则。
东方之珠 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
我这只是举个例子,不是就求这几个数,
[/Quote]
规则没说清楚,什么叫异常数据,哪些算异常数据??
Tiger_Zhao 2012-03-28
  • 打赏
  • 举报
回复
要根据你的业务规则选地一个过滤规则,比如:
A)假定数据有效范围 [0.0, 3.0],直接排除 >3.0 的数。
B)假定异常数据不会连续出现,如果 A(i) > A(i-1)*2 则排除 n(i)。
C)将数组排序,取中间一个数 M=A(n\2),排除 > M*2 的数。
还有人用VB6吗 2012-03-28
  • 打赏
  • 举报
回复
我想求个通用算法,关键是剔除不合理的数据
下列数序列呢 需要剔除4.03 4.94 然后计算
3.04
2.98
3.07
3.22
3.44
3.14
3.06
4.03
3.06
3.14
2.96
4.03
3.09
3.06
2.98
3.05
3.04
3.03
4.94
3.04
3.04
还有人用VB6吗 2012-03-28
  • 打赏
  • 举报
回复
我这只是举个例子,不是就求这几个数,
无·法 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 yzy912 的回复:]
一系列数据,其中有几个异常数据干扰,影响平均数大小,怎么剔除该数据?
下列数据中需要 剔除 3.42 3.82 4.6
1.4
3.42
1.46
1.46
1.48
1.45
1.45
3.82
1.48
1.46
4.6
1.45
1.49
1.49
1.5
[/Quote]逐个比较,如果xx>1 and xx<2就保留
孤独剑_LPZ 2012-03-28
  • 打赏
  • 举报
回复
一系列数据放入字符串会吧,然后将那三个 数分别替换为空,再计算
还有人用VB6吗 2012-03-28
  • 打赏
  • 举报
回复
在线等,急
熊孩子开学喽 2012-03-28
  • 打赏
  • 举报
回复
嘿嘿, 介个不就是除尘去划伤的算法么.
贝隆 2012-03-28
  • 打赏
  • 举报
回复
两种思路,两种办法:

Option Explicit
Dim dblP(0 To 14) As Double
Dim dblA As Double '偏差判断值
'平均值法
Private Sub Command1_Click()
Dim intP As Integer
Dim dblSum As Double

dblA = 1#

For intP = 0 To 14
dblSum = dblSum + dblP(intP)
Next intP
dblSum = dblSum / 15

For intP = 0 To 14
If Abs(dblP(intP) - dblSum) > dblA Then
Print "dblP(" & CStr(intP) & ")=" & dblP(intP) & " 是异常数据!"
End If
Next intP
End Sub
'排序法
Private Sub Command2_Click()
Dim intP As Integer
Dim intT As Integer
Dim dblT As Double

dblA = 2#

'执行排序
For intP = 0 To 13
For intT = intP + 1 To 14
If dblP(intP) < dblP(intT) Then
dblT = dblP(intT)
dblP(intT) = dblP(intP)
dblP(intP) = dblT
End If
Next intT
Next intP

For intP = 0 To 14
If dblP(intP) > dblA Then
Print "dblP(" & CStr(intP) & ")=" & dblP(intP) & " 是异常数据!"
End If
Next intP
End Sub

Private Sub Form_Load()
dblP(0) = 1.4
dblP(1) = 3.42
dblP(2) = 1.46
dblP(3) = 1.46
dblP(4) = 1.48
dblP(5) = 1.45
dblP(6) = 1.45
dblP(7) = 3.82
dblP(8) = 1.48
dblP(9) = 1.46
dblP(10) = 4.6
dblP(11) = 1.45
dblP(12) = 1.49
dblP(13) = 1.49
dblP(14) = 1.5


End Sub

贝隆 2012-03-28
  • 打赏
  • 举报
回复

Option Explicit
Dim dblP(0 To 14) As Double
Dim dblA As Double '偏差判断值
Private Sub Command1_Click()
Dim intP As Integer
Dim dblSum As Double
For intP = 0 To 14
dblSum = dblSum + dblP(intP)
Next intP
dblSum = dblSum / 15

For intP = 0 To 14
If Abs(dblP(intP) - dblSum) > dblA Then
Print "dblP(" & CStr(intP) & ")=" & dblP(intP) & " 是异常数据!"
End If
Next intP
End Sub

Private Sub Form_Load()
dblP(0) = 1.4
dblP(1) = 3.42
dblP(2) = 1.46
dblP(3) = 1.46
dblP(4) = 1.48
dblP(5) = 1.45
dblP(6) = 1.45
dblP(7) = 3.82
dblP(8) = 1.48
dblP(9) = 1.46
dblP(10) = 4.6
dblP(11) = 1.45
dblP(12) = 1.49
dblP(13) = 1.49
dblP(14) = 1.5

dblA = 1#
End Sub

贝隆 2012-03-28
  • 打赏
  • 举报
回复
这个问题就得看你的异常数据的的“异常度”了,如果偏差比较大,你可以先求出所有数据的平均值,在将每个数据和这个平均值比较,如果该数据和平均值之差大于“异常度”,那么就是异常数据。

还有一个思路,就是排序。再排序后,求相邻两个数据之差,如果这个差值大于“异常度”,那么就表示之前的数据(从大到小排序)是异常数据。
加载更多回复(2)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧