好的,基本上我必须做一个kmeans聚类程序,其中数据文件的格式为
此外,我很抱歉代码中有很多评论,我计划在我开始工作后进行清理
1 6.3 2.8 5.1 1.5
其中1是ID,然后是萼片长度,萼片宽度,踏板长度,然后踏板宽度。我收到了与输入有关的错误以及如何将其读入我的双向链表。我使用前两个条目来创建前两个集群,这就是为什么它们是单独完成的,其余的是读入它们最接近的集群。我很确定这个问题与我在文件中读取的方式有关,然后将其转换为数值
非常感谢任何帮助!!
(我也知道它应该是花瓣,我搞砸了)
public void read(String fname){
BufferedReader reader=null;
//listA=listA.linkedList();
//listB=listB.linkedList();
try{
FileReader fr=new FileReader(fname);
reader= new BufferedReader(fr);
Random rand=new Random();
int i;
//listA.DoublyLinkedList();
//listB.DoublyLinkedList();
for (i=0; i<2; i++){
String line=reader.readLine();
String values[]= new String[5];
values=line.split(" ");
int id=Integer.parseInt(values[0]);
double sepall=Double.parseDouble(values[1]);
double sepalw=Double.parseDouble(values[2]);
double petall= Double.parseDouble(values[3]);
double petalw= Double.parseDouble(values[4]);
//int j=rand.nextInt(2)+1;
if(i==0){
listA.insertAtEnd(id, sepall, sepalw, petall, petalw);
id1=id;
sepall1=sepall;
sepalw1=sepalw;
petall1=petall;
petalw1=petalw;
petal1=petall1*petalw1;
sepal1=sepall1*sepalw1;
}else{
listB.insertAtEnd(id,sepall,sepalw,petall,petalw);
id2=id;
sepall2=sepall;
sepalw2=sepalw;
petall2=petall;
petalw2=petalw;
petal2=petall2*petalw2;
sepal2=sepall2*sepalw2;
}
}
}catch(FileNotFoundException fne){
System.out.print("File not Found");
}catch(IOException ex){
ex.printStackTrace();
}finally{
//if(reader.readLine()==null){
try{
reader.close();
}catch(IOException ex){
ex.printStackTrace();
}
//}
}
for(int i=2;i<150; i++){
try{
//String fname=args[0];
//BufferedReader reader= new BufferedReader(new FileReader(fname));
//Random rand=new Random();
FileReader fr=new FileReader(fname);
reader= new BufferedReader(fr);
//DoublyLinkedList listA= new DoublyLinkedList();
//DoublyLinkedList listB= new DoublyLinkedList();
//int i;
//listA.linkedList();
//listB.linkedList();
for (i=0; i<2; i++){
String line=reader.readLine();
String values[]= new String[5];
values=line.split(" ");
id= Integer.valueOf(values[0]);
sepall= Double.parseDouble(values[1]);
sepalw= Double.parseDouble(values[2]);
petall= Double.parseDouble(values[3]);
petalw= Double.parseDouble(values[4]);
//int j=rand.nextInt(2)+1;
petal=petalw*petall;
sepal=sepalw*sepall;
double s1=sepal1-sepal;
double s2=sepal2-sepal;
double p1=petal1-petal;
double p2=petal2-petal;
s1=Math.abs(s1);
s2=Math.abs(s2);
p1=Math.abs(p1);
p2=Math.abs(p2);
if(s1<s2){ //if sepal is closer to 2
if(p1<p2){
listB.insertAtEnd(id,sepall,sepalw,petall,petalw);
}else{
double s=s2-s1;
double p=p1-p2;
if(s>p){
listA.insertAtEnd(id,sepall,sepalw,petall,petalw);
}else{
listB.insertAtEnd(id,sepall,sepalw,petall,petalw);
}
}
}else{
if(p2<p1){
listA.insertAtEnd(id,sepall,sepalw,petall,petalw);
}else{
double s=s1-s2;
double p=p2-p1;
if(s>p){
listB.insertAtEnd(id,sepall,sepalw,petall,petalw);
}else{
listA.insertAtEnd(id,sepall,sepalw,petall,petalw);
}
}
}
}
}catch(FileNotFoundException fne){
System.out.print("File not Found");
}catch(IOException ex){
ex.printStackTrace();
}finally{
//if(reader.readLine()!=null){
try{
reader.close();
}catch(IOException ex){
ex.printStackTrace();
}
}
//}
}
}
public void itteration(){
int size=listA.getSize();
petal1=listA.calculateMeanPetal();
petal2=listB.calculateMeanPetal();
sepal1=listA.calculateMeanSepal();
sepal2=listB.calculateMeanSepal();
Node node=listA.getEnd();
for(int i=size;i>0;i--){
id=node.getid();
sepall=node.getsepall();
sepalw=node.getsepalw();
petall=node.getpetall();
petalw=node.getpetalw();
petal=petalw*petall;
sepal=sepalw*sepall;
double s1=sepal1-sepal;
double s2=sepal2-sepal;
double p1=petal1-petal;
double p2=petal2-petal;
s1=Math.abs(s1);
s2=Math.abs(s2);
p1=Math.abs(p1);
p2=Math.abs(p2);
if(s1<s2){ //if sepal is closer to 2
if(p1<p2){
}else{
double s=s2-s1;
double p=p1-p2;
if(s>p){
}else{
listA.deleteAtPos(i);
listB.insertAtEnd(id,sepall,sepalw,petall,petalw);
}
}
}else{
if(p2<p1){
listA.deleteAtPos(i);
listB.insertAtEnd(id,sepall,sepalw,petall,petalw);
}else{
double s=s1-s2;
double p=p2-p1;
if(s>p){
listA.deleteAtPos(i);
listB.insertAtEnd(id,sepall,sepalw,petall,petalw);
}else{
}
}
}
node=node.getPrev();
}
size=listB.getSize();
node=listB.getEnd();
for(int i=size;i>0;i--){
id=node.getid();
sepall=node.getsepall();
sepalw=node.getsepalw();
petall=node.getpetall();
petalw=node.getpetalw();
petal=petalw*petall;
sepal=sepalw*sepall;
double s1=sepal1-sepal;
double s2=sepal2-sepal;
double p1=petal1-petal;
double p2=petal2-petal;
s1=Math.abs(s1);
s2=Math.abs(s2);
p1=Math.abs(p1);
p2=Math.abs(p2);
if(s2<s1){ //if sepal is closer to 2
if(p2<p1){
}else{
double s=s2-s1;
double p=p1-p2;
if(s>p){
}else{
listB.deleteAtPos(i);
listA.insertAtEnd(id,sepall,sepalw,petall,petalw);
}
}
}else{
if(p2<p1){
listB.deleteAtPos(i);
listA.insertAtEnd(id,sepall,sepalw,petall,petalw);
}else{
double s=s2-s1;
double p=p1-p2;
if(s>p){
listB.deleteAtPos(i);
listA.insertAtEnd(id,sepall,sepalw,petall,petalw);
}else{
}
}
}
node=node.getPrev();
}
}