import java.io.*;
import java.util.*;
public class c_average {
private static BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
private static int n=0;//用户输入样本组中样本个数
//private static Point point;
private static ArrayList<Point> pointList=new ArrayList<Point>();//存储样本集合
private static ArrayList<Point> pointSet1=new ArrayList<Point>();//存储类别
private static ArrayList<Point> pointSet2=new ArrayList<Point>();//存储类别
private static Point center1=new Point();//两组的中心
private static Point center2=new Point();
private static Euclidean distance_e=new Euclidean();
private static boolean start=false;//是否开始分组
private static String s;
/**
* @param args
*/
public static void main(String[] args) {
try{
while(!start){//核对输入
addPoints();//用户输入样本组
showPoints();//显示已输入样本组供用户核对
System.out.println("如核对无误,输入Start,如需重新输入,输入Reset");
if(input.readLine().trim().equals("Start")){
start=true;
}
}
System.out.println("请输入初始中心样本编号,用空格隔开:");//x1 x2为测试用,待修改为用户初始
s=input.readLine().trim();
center1=pointList.get(Integer.parseInt(getChar(s)[0]));
center2=pointList.get(Integer.parseInt(getChar(s)[1]));
System.out.println("开始进行分类");
classification(pointList,center1,center2);//进行初次分类
showResult(pointList);
while(reJudge(pointSet1,pointSet2,center1,center2)){//需要重新分类
//重新选定中点
center1=getCenter(pointSet1);
center2=getCenter(pointSet2);
//再次分类
classification(pointList,center1,center2);
//显示此次分类结果
System.out.println("此次分类中心:");
System.out.println("Z1:"+center1.getX()+","+center1.getY());
System.out.println("Z2:"+center2.getX()+","+center2.getY());
showResult(pointList);
}
System.out.println("分类完毕");
}catch(Exception e){
e.printStackTrace(System.err);
}
}
public static ArrayList addPoints(){
//ArrayList pointList=new ArrayList();//存储样本集合
Point[] points;
double d1;//存储每个样本的特征量
double d2;//存储每个样本的特征量
String s;
System.out.println("请输入需要判断的样本(c=2),两个特征量间以空格隔开,以回车结束一个点的输入,end结束所有输入:");
try{
while(!(s=input.readLine()).equals("end")){
n++;
d1=Double.parseDouble(getChar(s)[0]);
d2=Double.parseDouble(getChar(s)[1]);
Point point=new Point();
point.setX(d1);
point.setY(d2);
pointList.add(point);
}
}
catch(Exception e){
e.printStackTrace(System.err);
}
return pointList;
}
public static void showPoints(){
for(int i=1;i<=n;i++){
Point point=pointList.get(i-1);
System.out.println("x"+i+":"+point.getX()+","+point.getY());
}
}
public static String[] getChar(String s){//从用户输入中读出两个特征量
String[] userchar=null;
try{
userchar=s.split(" ");
}
catch (Exception e) {
e.printStackTrace(System.err);
}
return userchar;
}
public static boolean judgeSame(Point p1,Point p2){//判断两个点是否相同
double mx=Math.abs(p1.getX()-p2.getX());
double my=Math.abs(p1.getY()-p2.getY());
if(mx<=0.01&& my<=0.01){
return true;
}
else
return false;
}
public static Point getCenter(ArrayList<Point> list){//获取一个样本组的中点
Point center=new Point();
double x;
double y;
double sumX=0;
double sumY=0;
for(int i=0;i<list.size();i++){
sumX+=list.get(i).getX();
}
for(int i=0;i<list.size();i++){
sumY+=list.get(i).getY();
}
x=sumX/list.size();
y=sumY/list.size();
center.setX(x);
center.setY(y);
return center;
}
//将一个样本组中的点分类 分别保存在两个组中
public static void classification(ArrayList<Point> list,Point center1,Point center2){
pointSet1.clear();
pointSet2.clear();
for(int i=0;i<list.size();i++){
if(distance_e.calculating(list.get(i), center1)<distance_e.calculating(list.get(i), center2)){
pointSet1.add(list.get(i));
list.get(i).setFlag(1);
}
else{
pointSet2.add(list.get(i));
list.get(i).setFlag(2);
}
}
}
public static void showResult(ArrayList<Point> list){
String set1="Group1:"+"\n";
String set2="Group2:"+"\n";
for(int i=0;i<list.size();i++){
if(list.get(i).getFlag()==1){
set1+="x"+(i+1)+":"+list.get(i).getX()+","+list.get(i).getY()+"\n";
}
else if(list.get(i).getFlag()==2){
set2+="x"+(i+1)+":"+list.get(i).getX()+","+list.get(i).getY()+"\n";
}
}
System.out.println(set1);
System.out.println(set2);
}
//判断是否需要重新判断
public static boolean reJudge(ArrayList<Point> set1,ArrayList<Point> set2,Point center1,Point center2){
if(judgeSame(getCenter(set1),center1)&& judgeSame(getCenter(set2),center2))
return false;
else
return true;
}
}
Method_C.rar_欧氏距离
版权申诉
73 浏览量
2022-09-14
17:18:36
上传
评论
收藏 7KB RAR 举报
weixin_42653672
- 粉丝: 93
- 资源: 1万+
最新资源
- 基于Vue的hpch-dghl-exchange大国好礼礼品册兑换设计源码
- 基于Python的stocks_quotation_quant_backtest股票报价量化回测设计源码
- tensorflow-gpu-2.5.1-cp37-cp37m-manylinux2010-x86-64.whl
- 学生成绩管理系统(SSH+MYSQL)
- tensorflow-gpu-2.5.0-cp38-cp38-manylinux2010-x86-64.whl
- tensorflow-gpu-2.5.2-cp38-cp38-manylinux2010-x86-64.whl
- C#实现简易版别踩白块
- resnet模型-基于图像分类算法对蛇类识别-不含数据集图片-含逐行注释和说明文档.zip
- mobilenet模型-基于图像分类算法对短袖颜色识别-不含数据集图片-含逐行注释和说明文档.zip
- *电影院头歌数据库作业
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈