1. 程式人生 > >格拉布斯準則(java程式碼)

格拉布斯準則(java程式碼)

package rule;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
//格拉布斯準則
public class GLBS
{
	static Map<Double, Double> map=new HashMap<Double, Double>();
	List<Double> list;
	double mean;     //均值
	double mean2;   //平方均值
	int listNum;
	double variance;     //標準差
	
	public  GLBS(List<Double> list)
	{
		this.list=list;
		if(map.size()==0)
		{
			initMap();
		}
		mean_variance();
	}
	
	/**
	 * 均值和方差
	 */
	private  void mean_variance()
	{
	    listNum= list.size();
		for(Double d: list)
		{
			mean+=d;
			mean2+=d*d;
		}
		mean/=listNum;         //均值
		mean2/=listNum;
		variance=Math.sqrt(mean2-mean*mean); // 標準差
	}
	
	
	private  void initMap()
	{
		double[][] crisis= {
				{0,0,0,1.148,1.425,1.602,1.729,1.828,1.909,1.977,2.036,2.088,2.134,2.175,2.213,2.247,2.279,2.309,2.335,
						2.361,2.385,2.408,2.429,2.448,2.467,2.486,2.502,2.519,2.534,2.549,2.583,2.577,2.591,2.604,
						2.616,2.628,2.639,2.65,2.661,2.671,2.682,2.692,2.7,2.71,2.719,2.727,2.736,2.744,2.753,2.76,
						2.768,2.775,2.783,2.79,2.798,2.804,2.811,2.818,2.824,2.831,2.837,2.842,2.849,2.854,2.86,2.866,
						2.871,2.877,2.883,2.888,2.893,2.897,2.903,2.908,2.912,2.917,2.922,2.927,2.931,2.935,2.94,2.945,
						2.949,2.953,2.957,2.961,2.966,2.97,2.973,2.977,2.981,2.984,2.989,2.993,2.996,3,3.003,3.006,
						3.011,3.014,3.017},
				{0,0,0,1.153,1.463,1.672,1.822,1.938,2.032,2.11,2.176,2.234,2.285,2.331,2.371,2.409,2.443,2.475,2.501,
						2.532,2.557,2.58,2.603,2.624,2.644,2.663,2.681,2.698,2.714,2.73,2.745,2.759,2.773,2.786,2.799,
						2.811,2.823,2.835,2.846,2.857,2.866,2.877,2.887,2.896,2.905,2.914,2.923,2.931,2.94,2.948,2.956,
						2.943,2.971,2.978,2.986,2.992,3,3.006,3.013,3.019,3.025,3.032,3.037,3.044,3.049,3.055,3.061,
						3.066,3.071,3.076,3.082,3.087,3.092,3.098,3.102,3.107,3.111,3.117,3.121,3.125,3.13,3.134,3.139,
						3.143,3.147,3.151,3.155,3.16,3.163,3.167,3.171,3.174,3.179,3.182,3.186,3.189,3.193,3.196,3.201,
						3.204,3.207},
				{0,0,0,1.155,1.481,1.715,1.887,2.02,2.126,2.215,2.29,2.355,2.412,2.462,2.507,2.549,2.585,2.62,2.651,
						2.681,2.709,2.733,2.758,2.781,2.802,2.822,2.841,2.859,2.876,2.893,2.908,2.924,2.938,2.952,
						2.965,2.979,2.991,3.003,3.014,3.025,3.036,3.046,3.057,3.067,3.075,3.085,3.094,3.103,3.111,3.12,
						3.128,3.136,3.143,3.151,3.158,3.166,3.172,3.18,3.186,3.193,3.199,3.205,3.212,3.218,3.224,3.23,
						3.235,3.241,3.246,3.252,3.257,3.262,3.267,3.272,3.278,3.282,3.287,3.291,3.297,3.301,3.305,
						3.309,3.315,3.319,3.323,3.327,3.331,3.335,3.339,3.343,3.347,3.35,3.355,3.358,3.362,3.365,3.369,
						3.372,3.377,3.38,3.383},
				{0,0,0,1.155,1.492,1.749,1.944,2.097,2.22,2.323,2.41,2.485,2.55,2.607,2.659,2.705,2.747,2.785,2.821,
						2.954,2.884,2.912,2.939,2.963,2.987,3.009,3.029,3.049,3.068,3.085,3.103,3.119,3.135,3.15,3.164,
						3.178,3.191,3.204,3.216,3.228,3.24,3.251,3.261,3.271,3.282,3.292,3.302,3.31,3.319,3.329,3.336,
						3.345,3.353,3.361,3.388,3.376,3.383,3.391,3.397,3.405,3.411,3.418,3.424,3.43,3.437,3.442,3.449,
						3.454,3.46,3.466,3.471,3.476,3.482,3.487,3.492,3.496,3.502,3.507,3.511,3.516,3.521,3.525,3.529,
						3.534,3.539,3.543,3.547,3.551,3.555,3.559,3.563,3.567,3.57,3.575,3.579,3.582,3.586,3.589,3.593,
						3.597,3.6}};
		for(int i=3; i<=100; i++)
		{
			add(i, 0.90, crisis[0][i]);
			add(i, 0.95, crisis[1][i]);
			add(i, 0.975, crisis[2][i]);
			add(i, 0.99, crisis[3][i]);
		}
		add(101, 0.90, 3.02);
		add(101, 0.95, 3.21);
		add(101, 0.975, 3.39);
		add(101, 0.99, 3.65);
	}

	private  void add(int i, double d, double e)
	{
		map.put(i+d, e);
	}


	private  double Subtract(int n, double a, double value)
	{
		if(n>100)
		{
			n=101;
		}
		return value-map.get(n+a);
	}

	/**
	 * @return 返回剔除了所有異常資料的list
	 */
	public  List<Double> clipList()
	{
		int i=0;
		while(clipOne())
		{
			if(listNum<3)
			{
				break;
			}
			i++;
		}
		System.out.println(i);
		return list;
	}
	
	/**
	 * 至多剔除一個異常資料
	 * @return
	 */
	private boolean clipOne()
	{
		double t1=Math.abs(list.get(0)-mean)/variance;
		double tn=Math.abs(list.get(listNum-1)-mean)/variance;
		double sub1=Subtract(listNum, 0.90, t1);
		double subn=Subtract(listNum, 0.90, tn);
		if(sub1>0||subn>0)
		{
			double remove;
			if(sub1>subn)
			{
				remove=list.get(0);
				list.remove(0);
			}
			else
			{
				remove=list.get(listNum-1);
				list.remove(listNum-1);
			}
			mean=(listNum*mean-remove)/(listNum-1);     //均值更新
			mean2=(listNum*mean2-remove*remove)/(listNum-1);
			variance=mean2-mean*mean;        //方差更新
			listNum--;                              //個數更新
			return true;
		}
		return false;
	}

	public double getMean()
	{
		return mean;
	}
}

相關推薦

準則java程式碼

package rule; import java.util.HashMap; import java.util.List; import java.util.Map; //格拉布斯準則 public class GLBS { static Map<Double,

【資料異常校驗】準則Grubbs Criterion處理資料異常

簡介 Grubbs測試(以1950年發表測試的Frank E. Grubbs命名),也稱為最大歸一化殘差測試或極端學生化偏差測試,是一種統計測試,用於檢測假設的單變數資料集中的異常值來自正常分佈的人口。 定義 格拉布斯的測試基於正態假設。也就是說,在應用Grubbs

利用準則,剔除異常資料

一:步驟解說: 1、排列資料 Collections.sort(dataArrayList); 2、求平均值、標準差 3、計算Gi值:每個資料與平均數的殘差 / 標準差 4、用這個Gi 值 與  格拉布斯臨界表表中的 臨界值比較,越大,越異常,需剔除 注: 這個臨

如何通過程式java程式碼提高你的部落訪問量

最近對寫部落格比較感興趣,我想對於每一個寫部落格的人來說,都渴望自己寫的部落格能夠被別人看到,或者在搜尋引擎中搜索時容易被搜尋到,如何讓你的部落格容易被人搜尋到,從而提高訪問量呢?這裡我最推薦大家的方法是儘量原創,寫一些新鮮有趣,別人沒有寫過的內容,然後標題,關

2017.12 CCF第一題:最小差值 Java程式碼

問題描述   給定n個數,請找出其中相差(差的絕對值)最小的兩個數,輸出它們的差值的絕對值。 輸入格式   輸入第一行包含一個整數n。   第二行包含n個正整數,相鄰整數之間使用一個空格分隔。 輸出格式   輸出一個整數,表示答案。 樣例輸入 5 1 5 4 8 20

CCF2018.3 第一題:跳一跳 Java程式碼

問題描述   近來,跳一跳這款小遊戲風靡全國,受到不少玩家的喜愛。   簡化後的跳一跳規則如下:玩家每次從當前方塊跳到下一個方塊,如果沒有跳到下一個方塊上則遊戲結束。   如果跳到了方塊上,但沒有跳到方塊的中心則獲得1分;跳到方塊中心時,若上一次的得分為1分或這是本局遊戲的第一次跳躍則此次得分為

CCF2018.9 第一題賣菜 Java程式碼

問題描述   在一條街上有n個賣菜的商店,按1至n的順序排成一排,這些商店都賣一種蔬菜。   第一天,每個商店都自己定了一個價格。店主們希望自己的菜價和其他商店的一致,第二天,每一家商店都會根據他自己和相鄰商店的價格調整自己的價格。具體的,每家商店都會將第二天的菜價設定為自己和相鄰商店第一天菜價

LeetCode-118.楊輝三角java程式碼

此處僅貼參考程式碼(程式碼可繼續調優,但平臺Accepted了,留點思考空間~) public List<List<Integer>> generate(int numRows) { List<List<Inte

記錄一個演算法題java程式碼:統計正整數n的二進位制寫法中有多少個1

package ludims.main; import java.util.Scanner; public class myMain {     public static void main(String[] args) {         System.out.pri

File 程式Java程式碼

 public static void main(String[] args) {   /*    * 宣告流物件    */   FileReader fr = null;   BufferedReader br = null;   StringBuffer sb = new StringBuffer();

Echarts餅圖柱形圖調整文字大小java程式碼

1.餅圖:    Pie pie = new Pie();         pie.center("50%", "50%").radius(100);         ItemStyle style = new ItemStyle();         Normal nor

PAT1037 在霍沃茨找零錢java實現

題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805284923359232 題目描述: 如果你是哈利·波特迷,你會知道魔法世界有它自己的貨幣系統 —— 就如海格告訴哈利的:“十七個銀西

矩陣式比較兩文字字串相似度包含漢字方法兩則java程式碼

package com.gsww.ctyxy.util; import java.text.NumberFormat;   import java.util.Locale;    /**  * 比較兩個字串的相似度  */   public class AutomaticRating {   /*    pu

藍橋杯-----------------基礎訓練 數列排序Java程式碼

一、數列排序   問題描述:給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200。 二、解題思想: 對於排序,無論是資料結構還是自己手寫都有很多種方法進行解決。但是,

LeetCode 832. 翻轉影象Java程式碼

給定一個二進位制矩陣 A,我們想先水平翻轉影象,然後反轉影象並返回結果。 水平翻轉圖片就是將圖片的每一行都進行翻轉,即逆序。例如,水平翻轉 [1, 1, 0] 的結果是 [0, 1, 1]。 反轉圖片的意思是圖片中的 0 全部被 1 替換, 1 全部被 0 替換。例如,反

常見檔案操作java程式碼

位元組流和字元流概念 位元組流:位元組流讀取的時候,讀到一個位元組就返回一個位元組;主要用於讀取圖片,MP3,AVI視訊檔案。 字元流:字元流使用了位元組流讀到一個或多個位元組,如讀取

15位身份證號碼轉換成18位身份證號碼java程式碼

步驟:1. 兩位年份填充為四位;2. 生成最後一位校驗位; 程式碼如下: package com.mingo.common; import java.util.Scanner; public class IDcard15bitTo18bit {

ACM程式設計大賽-------- 最少錢幣數Java程式碼

【問題描述】           這是一個古老而又經典的問題。用給定的幾種錢幣湊成某個錢數,一般而言有多種方式。例如:給定了6種錢幣面值為2、5、10、20、50、100,用來湊 15元,可以用5個2元、1個5元,或者3個5元,或者1個5元、1個10元,等等。顯然,最少需要

Elasticsearch簡單操作Java程式碼

1.首先安裝Elasticsearch,配置相關檔案,並啟動服務 2.建立專案,匯入相關Jar包 3.建立ElasticsearchUtils類,裡面包括初始化操作和建立索引、更新索引、刪除索引、查詢索引 (1)初始化操作,需要傳入叢集名稱和ip地址,叢集名稱本例子使用elasticsearch配置檔

隆過濾器Bloom Filters的原理及程式碼實現Python + Java

本文介紹了布隆過濾器的概念及變體,這種描述非常適合程式碼模擬實現。重點在於標準布隆過濾器和計算布隆過濾器,其他的大都在此基礎上優化。文末附上了標準布隆過濾器和計算布隆過濾器的程式碼實現(Java版和Python版) 本文內容皆來自 《Foundations of Computers Systems Rese