学习吧,总会有厌倦期,EM算法就不自己写了,转帖一个源码,可运行,个人不喜欢算法的图形界面,所以这个算法也没怎么研究,但是可运行。转载的最初链接无从查起,如有侵权,请与我联系,带来不便,敬请谅解。不多啰嗦,直接上源码(个人感觉EM算法的高斯混合模型好难- -、)

  1 import java.awt.Dimension;
  2 import java.awt.EventQueue;
  3 import java.awt.Toolkit;
  4 import java.awt.event.ActionEvent;
  5 import java.awt.event.ActionListener;
  6 import java.util.ArrayList;
  7
  8 import java.lang.Math;
  9 import java.text.DecimalFormat;
 10
 11 import javax.swing.JButton;
 12 import javax.swing.JFrame;
 13 import javax.swing.JLabel;
 14 import javax.swing.JScrollPane;
 15 import javax.swing.JTable;
 16 import javax.swing.JTextField;
 17
 18
 19 public class MachineTranslation{
 20     private static final long serialVersionUID = 2904270580467455923L;
 21     public static void main(String[] args) {
 22         EventQueue.invokeLater(new Runnable() {
 23             public void run() {
 24                 Display frame = new Display();
 25                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 26                 frame.setVisible(true);
 27             }
 28         });
 29     }
 30 }
 31
 32 class Display extends JFrame {
 33     private static final int DEFAULT_WIDTH = 532;
 34     private static final int DEFAULT_HEIGHT = 508;
 35
 36     private JTextField textField_3;
 37     private JTextField textField_2;
 38     private JTextField textField_1;
 39     private static final long serialVersionUID = -2794537679802534502L;
 40
 41     private JTable table;
 42     private JTextField textField;
 43     private final JButton emButton;
 44
 45     public Display() {
 46         super();
 47         getContentPane().setLayout(null);
 48         setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
 49
 50
 51         textField = new JTextField("<HHH>,<TTT>,<HHH>,<TTT>");
 52         textField.setBounds(61, 42, 237, 33);
 53         getContentPane().add(textField);
 54
 55         emButton = new JButton();
 56         emButton.setText("EM");
 57         emButton.setBounds(344, 44, 106, 28);
 58         getContentPane().add(emButton);
 59
 60
 61         final JLabel wLabel = new JLabel();
 62         wLabel.setText("λ");
 63         wLabel.setBounds(61, 98, 25, 18);
 64         getContentPane().add(wLabel);
 65
 66         final JLabel p1Label = new JLabel();
 67         p1Label.setText("P1");
 68         p1Label.setBounds(198, 98, 25, 18);
 69         getContentPane().add(p1Label);
 70
 71         final JLabel p2Label = new JLabel();
 72         p2Label.setText("P2");
 73         p2Label.setBounds(349, 98, 25, 18);
 74         getContentPane().add(p2Label);
 75
 76         textField_1 = new JTextField();
 77         textField_1.setText("0.3");
 78         textField_1.setBounds(86, 96, 87, 22);
 79         getContentPane().add(textField_1);
 80
 81         textField_2 = new JTextField();
 82         textField_2.setText("0.3");
 83         textField_2.setBounds(229, 96, 87, 22);
 84         getContentPane().add(textField_2);
 85
 86         textField_3 = new JTextField();
 87         textField_3.setText("0.6");
 88         textField_3.setBounds(380, 96, 87, 22);
 89         getContentPane().add(textField_3);
 90
 91         setTitle("掷硬币EM算法之实现");
 92
 93         Toolkit tk =this.getToolkit();//得到窗口工具条
 94         Dimension dm = tk.getScreenSize();
 95         this.setLocation((int)(dm.getWidth()-DEFAULT_WIDTH)/2,(int)(dm.getHeight()-DEFAULT_HEIGHT)/2);//显示在屏幕中央
 96
 97
 98         emButton.addActionListener(new ActionListener() {
 99             public void actionPerformed(ActionEvent event) {
100                 EmAlgorithm em = new EmAlgorithm(textField.getText(),textField_1.getText(),textField_2.getText(),textField_3.getText());
101                 em.maximizeExpectation();
102                 final JScrollPane scrollPane = new JScrollPane();
103                 scrollPane.setBounds(37, 121, 453, 261);
104                 getContentPane().add(scrollPane);
105
106                 table= new JTable(em.getCells(),em.getColumnNames());
107                 scrollPane.setViewportView(table);
108                 System.out.println(1E-300-1E-301>0);
109             }
110         });
111     }
112 }
113
114 class EmAlgorithm{
115     private String str;
116     private ArrayList<Sub> sub=new ArrayList<Sub>();
117     private ArrayList<Double> w=new ArrayList<Double>();
118     private ArrayList<Double> P1=new ArrayList<Double>();
119     private ArrayList<Double> P2=new ArrayList<Double>();
120     private ArrayList<ArrayList<Double>> p;
121
122     private Object[][] cells;
123     private String[] columnNames;
124
125     public EmAlgorithm(String str, String str1,String str2, String str3){
126         this.str=str;
127         w.add(Double.parseDouble(str1));
128         P1.add(Double.parseDouble(str2));
129         P2.add(Double.parseDouble(str3));
130
131         textSplit();
132         p=new ArrayList<ArrayList<Double>>();
133         for(int j = 0; j < sub.size(); ++j)
134             p.add(new ArrayList<Double>());
135         System.out.println(p);
136     }
137     public void textSplit(){
138         String[] sList;
139         sList=str.substring(1,str.length()-1).split(">,<");
140
141         for (int i = 0; i < sList.length; i++){
142             sub.add(new Sub(sList[i]));
143         }
144         System.out.println(sub);
145     }
146     public void maximizeExpectation(){
147         int iterate=0;
148         if (!P1.get(P1.size() - 1).equals(P2.get(P2.size() - 1))) {
149             do {
150                 iterate++;
151                 compute();
152             } while (Math.abs(P1.get(P1.size() - 1) - P1.get(P1.size() - 2)) > 0.0000001);
153             // }while(Math.abs(P1.get(P1.size()-1)-P1.get(P1.size()-2))>1.E-300);
154         }
155         else{
156             iterate=7;
157             for(int i=0;i<iterate;i++){
158                 compute();
159             }
160         }
161         cells=new Object[p.get(0).size()][4+sub.size()];
162
163         DecimalFormat df_t=new DecimalFormat("0.0000");
164
165         for(int i=0;i<iterate;i++){
166             cells[i][0]=i;
167             cells[i][1]=df_t.format(w.get(i));
168             cells[i][2]=df_t.format(P1.get(i));
169             cells[i][3]=df_t.format(P2.get(i));
170             for(int j=0;j<sub.size();j++){
171                 cells[i][j+4]=df_t.format(p.get(j).get(i));
172             }
173         }
174         columnNames=new String[4+sub.size()];
175         columnNames[0]="Iteration";
176         columnNames[1]="w";
177         columnNames[2]="P1";
178         columnNames[3]="P2";
179         for(int i=0;i<sub.size();i++)
180             columnNames[i+4]="p"+(i+1);
181     }
182     public void compute(){
183         double w=this.w.get(this.w.size()-1);
184         double P1=this.P1.get(this.P1.size()-1);
185         double P2=this.P2.get(this.P2.size()-1);
186         //System.out.println(w+","+P1+","+P2+"     "+this.w.size());
187         for (int i = 0; i < sub.size(); i++) {
188             float PP1 = (float) Math.pow(P1, sub.get(i).getH())
189                     * (float) Math.pow(1 - P1,sub.get(i).getT());
190             float PP2 = (float) Math.pow(P2, sub.get(i).getH())
191                     * (float) Math.pow(1 - P2, sub.get(i).getT());
192             p.get(i).add(w * PP1 / (w * PP1 + (1 - w) * PP2));
193         }
194         double sump=0;
195         double sumP1=0;
196         double sumP2=0;float sumpp=0;
197
198         for(int i=0;i<sub.size();i++){
199             sump+=p.get(i).get(p.get(i).size()-1);
200             sumP1+=(sub.get(i).getH()/3.0)*p.get(i).get(p.get(i).size()-1);
201             sumP2+=(sub.get(i).getH()/3.0)*(1-p.get(i).get(p.get(i).size()-1));
202             sumpp+=(1-p.get(i).get(p.get(i).size()-1));
203         }
204         this.w.add(sump/sub.size());
205         this.P1.add(sumP1/sump);
206         this.P2.add(sumP2/sumpp);
207     }
208     public Object[][] getCells(){
209         return cells;
210     }
211     public String[] getColumnNames(){
212         return columnNames;
213     }
214 }
215 class CountHT{
216     private int hCount=0;
217     private int tCount=0;
218
219     public CountHT(String str){
220         char[] temp=str.toCharArray();
221         for(int j=0;j<temp.length;j++){
222             if(temp[j]=='H'){
223                 hCount++;
224                 continue;
225             }
226             if(temp[j]=='T'){
227                 tCount++;
228                 continue;
229             }
230             System.out.println("输入有问题");
231         }
232     }
233     public int getH(){
234         return hCount;
235     }
236     public int getT(){
237         return tCount;
238     }
239 }
240
241 class Sub{
242     private String str;
243     private int hCount;
244     private int tCount;
245
246     public Sub(String str){
247         this.str=str;
248         CountHT countHT=new CountHT(str);
249         hCount=countHT.getH();
250         tCount=countHT.getT();
251     }
252     public String toString(){
253         return str+" "+"hCount="+hCount+" "+"tCount="+tCount;
254     }
255     public int getH(){
256         return hCount;
257     }
258     public int getT(){
259         return tCount;
260     }
261 }

转载于:https://www.cnblogs.com/wn19910213/p/3337538.html

java - EM算法相关推荐

  1. java em算法_python em算法的实现

    ''' 数据集:伪造数据集(两个高斯分布混合) 数据集长度:1000 ------------------------------ 运行结果: ---------------------------- ...

  2. EM算法matlab和Java实现

    EM算法具体过程看前一篇博客 一.matlab实现 1.matlab代码 close all; clear; clc;%% M=3; % 高斯数量 N=600; % 数据样本总数 th=0.00000 ...

  3. em算法的java实现_EM算法 - Java教程 - 找一找教程网

    1.背景 2.理论 2.1.Jensen不等式 优化理论中,假设 \(f\) 是定义域为实数的函数,如果对于所有的实数 \(x\) ,且二阶导数\(f''(x)\geq 0\) ,则 \(f\) 是凸 ...

  4. gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现

    1. 前言 EM的前3篇博文分别从数学基础.EM通用算法原理.EM的高斯混合模型的角度介绍了EM算法.按照惯例,本文要对EM算法进行更进一步的探究.就是动手去实践她. 2. GMM实现 我的实现逻辑基 ...

  5. em算法的java实现_机器学习——python模拟EM算法

    <统计学习方法> 李航著 第九章 EM算法 我是小白一个:本文代码转载地址文末有注释:除代码和部分注释外大部分自己书写,有问题请多指教 模拟课本第一个例子,即用EM算法估计三个硬币模型的参 ...

  6. 概率语言模型及其变形系列-PLSA及EM算法

    转载自:http://blog.csdn.net/yangliuy/article/details/8330640 本系列博文介绍常见概率语言模型及其变形模型,主要总结PLSA.LDA及LDA的变形模 ...

  7. 从最大似然到EM算法浅解 http://blog.csdn.net/zouxy09/article/details/8537620

    1. EM blog的举例就是group 然后就是每个group的function很有效地串联所学的知识,看到的论文,所有的思考,都是有一定的逻辑关系,如何逐渐develop你的想法,都是有一定的源头 ...

  8. 聚类和EM算法——K均值聚类

    20211116 数据分析 | 聚类分析--kmean kmeans最优k值的确定方法-手肘法和轮廓系数法 - 简书 python大战机器学习--聚类和EM算法 注:本文中涉及到的公式一律省略(公式不 ...

  9. Java排序算法:冒泡排序

    Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...

  10. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

最新文章

  1. PHP学习(php概念、基本语法、流程控制)
  2. php spss,spss数据分析的一般步骤
  3. 404 Note Found 团队会议纪要
  4. 组件化与插件化的差别在哪里?附面试题答案
  5. Vue之Vue.set动态新增对象属性
  6. 仓库温度湿度控制措施_药品仓库如何保持温湿度均衡?
  7. python 示例_带有示例的Python File read()方法
  8. 使用NPOI——C#和WEB API导出到Excel
  9. Android的清单文件添加百度地图SDK
  10. plc用c语言编程的好处,学习PLC编程的重要性
  11. 串口硬盘如何应用于并口硬盘计算机,串口并口硬盘连接具体步骤(转)
  12. php商城拍卖逻辑,thinkphp商城购物车逻辑思路
  13. Linux终端复制粘贴后前后会多出0~和~1
  14. 我的2019归零,2020走你
  15. 23 种设计模式的分类 - Design Patterns
  16. xcopy 跳过已经存在的_南京的野猪已经会逛奶茶店了?!
  17. 手机内存卡照片删了怎么恢复
  18. Linux系统日志管理
  19. bootstrapTable动态渲染数据获取
  20. 谷歌高质量外链,google英文外链怎么做效果好?

热门文章

  1. C语言 全局变量和局部变量的区别
  2. 搜狗输入法纯净_输入法纯净,你其实只差个补丁
  3. 国家地表水水质自动监测站坐标每四小时数据(共1952个监测站,含省份、城市、河流、流域、断面名称、监测时间、水温、pH、DO、CODMn、TP、TN、NH3-N、浊度等)
  4. matlab怎样定义全局变量,Matlab如何定义公共变量
  5. 至尊无上“武林神话”——下载最强3dmax插件神器|高效顶级3dmax插件神器“王者荣耀”加冕?满血拉二胡,开挂横着走!
  6. RecycleView多布局的实现
  7. arduino霍尔编码器蓝牙小车代码
  8. 数字化成熟度评估模型一文读尽
  9. 如何在打印机驱动详细信息不能查看的情况下利用DISM命令备份还原打印机驱动
  10. 薅羊毛!如何让趣头条自动阅读挣钱