java - EM算法
学习吧,总会有厌倦期,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算法相关推荐
- java em算法_python em算法的实现
''' 数据集:伪造数据集(两个高斯分布混合) 数据集长度:1000 ------------------------------ 运行结果: ---------------------------- ...
- EM算法matlab和Java实现
EM算法具体过程看前一篇博客 一.matlab实现 1.matlab代码 close all; clear; clc;%% M=3; % 高斯数量 N=600; % 数据样本总数 th=0.00000 ...
- em算法的java实现_EM算法 - Java教程 - 找一找教程网
1.背景 2.理论 2.1.Jensen不等式 优化理论中,假设 \(f\) 是定义域为实数的函数,如果对于所有的实数 \(x\) ,且二阶导数\(f''(x)\geq 0\) ,则 \(f\) 是凸 ...
- gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现
1. 前言 EM的前3篇博文分别从数学基础.EM通用算法原理.EM的高斯混合模型的角度介绍了EM算法.按照惯例,本文要对EM算法进行更进一步的探究.就是动手去实践她. 2. GMM实现 我的实现逻辑基 ...
- em算法的java实现_机器学习——python模拟EM算法
<统计学习方法> 李航著 第九章 EM算法 我是小白一个:本文代码转载地址文末有注释:除代码和部分注释外大部分自己书写,有问题请多指教 模拟课本第一个例子,即用EM算法估计三个硬币模型的参 ...
- 概率语言模型及其变形系列-PLSA及EM算法
转载自:http://blog.csdn.net/yangliuy/article/details/8330640 本系列博文介绍常见概率语言模型及其变形模型,主要总结PLSA.LDA及LDA的变形模 ...
- 从最大似然到EM算法浅解 http://blog.csdn.net/zouxy09/article/details/8537620
1. EM blog的举例就是group 然后就是每个group的function很有效地串联所学的知识,看到的论文,所有的思考,都是有一定的逻辑关系,如何逐渐develop你的想法,都是有一定的源头 ...
- 聚类和EM算法——K均值聚类
20211116 数据分析 | 聚类分析--kmean kmeans最优k值的确定方法-手肘法和轮廓系数法 - 简书 python大战机器学习--聚类和EM算法 注:本文中涉及到的公式一律省略(公式不 ...
- Java排序算法:冒泡排序
Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...
- java python算法_用Python,Java和C ++示例解释的排序算法
java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...
最新文章
- PHP学习(php概念、基本语法、流程控制)
- php spss,spss数据分析的一般步骤
- 404 Note Found 团队会议纪要
- 组件化与插件化的差别在哪里?附面试题答案
- Vue之Vue.set动态新增对象属性
- 仓库温度湿度控制措施_药品仓库如何保持温湿度均衡?
- python 示例_带有示例的Python File read()方法
- 使用NPOI——C#和WEB API导出到Excel
- Android的清单文件添加百度地图SDK
- plc用c语言编程的好处,学习PLC编程的重要性
- 串口硬盘如何应用于并口硬盘计算机,串口并口硬盘连接具体步骤(转)
- php商城拍卖逻辑,thinkphp商城购物车逻辑思路
- Linux终端复制粘贴后前后会多出0~和~1
- 我的2019归零,2020走你
- 23 种设计模式的分类 - Design Patterns
- xcopy 跳过已经存在的_南京的野猪已经会逛奶茶店了?!
- 手机内存卡照片删了怎么恢复
- Linux系统日志管理
- bootstrapTable动态渲染数据获取
- 谷歌高质量外链,google英文外链怎么做效果好?
热门文章
- C语言 全局变量和局部变量的区别
- 搜狗输入法纯净_输入法纯净,你其实只差个补丁
- 国家地表水水质自动监测站坐标每四小时数据(共1952个监测站,含省份、城市、河流、流域、断面名称、监测时间、水温、pH、DO、CODMn、TP、TN、NH3-N、浊度等)
- matlab怎样定义全局变量,Matlab如何定义公共变量
- 至尊无上“武林神话”——下载最强3dmax插件神器|高效顶级3dmax插件神器“王者荣耀”加冕?满血拉二胡,开挂横着走!
- RecycleView多布局的实现
- arduino霍尔编码器蓝牙小车代码
- 数字化成熟度评估模型一文读尽
- 如何在打印机驱动详细信息不能查看的情况下利用DISM命令备份还原打印机驱动
- 薅羊毛!如何让趣头条自动阅读挣钱