📄 form1.cs
字号:
{
dis=(float)Math.Sqrt((paper[j].a1-paper[k].a1)*(paper[j].a1-paper[k].a1)+(paper[j].a2-paper[k].a2)*(paper[j].a2-paper[k].a2)+(paper[j].a3-paper[k].a3)*(paper[j].a3-paper[k].a3)+(paper[j].a4-paper[k].a4)*(paper[j].a4-paper[k].a4));
disarray[j,k]=dis;
//textBox2.Text=textBox2.Text+dis.ToString ()+"\r\n";
//Console.WriteLine(dis);
}
//
int h=1,m,l=0,p;
int n=0;
while(h<=3)//找到k个初始聚类中心
{
temp=100;
//找到两个最近的
for(j=0;j<i;j++)
for(k=j+1;k<i;k++)
{
if((disarray[j,k]<temp)&&((paper[j].lable==0)&&(paper[k].lable==0)))
{
temp=disarray[j,k];
l=j;
n=k;
}
}
paper[l].cla=paper[n].cla=h;
paper[l].lable=1;
paper[n].lable=1;
///////找到两个最近的
/////找出距离集合最近的点,共要找0.75*i/3个
int number;
number=2;n=0;
while(number<=(0.75*i/3))//找到0.75*i/3个点
{
p=0;
temp1=100;
while(p<i)//在整个点集合上找到距离最近的一个点
{
if(paper[p].cla==h)//找到一个输入Am的点
{
m=0;
while(m<i)
{
if((paper[m].lable==0)&&(disarray[m,p]<temp1))//找将要加入Am的点
{
temp1=disarray[m,p];
n=m;
}
m++;
}
}//找到了到p点距离最近地点
p++;
}//while 找到了距离集合Am最近地点
paper[n].cla=h;
paper[n].lable=1;
number++;
}//while
textBox2.Text=number.ToString();
h++;
}//while
//
/////找出距离集合最近的点,共要找0.75*/3个
int u,v,w;
u=v=w=0;
p=0;
while(p<i)
{
if(paper[p].cla==1)
{
u++;
}
else if(paper[p].cla ==2)
{
v++;
}
else if(paper[p].cla==3)
{
w++;
}////endif
p++;
}//endwhile
textBox3.Text=u.ToString();
textBox4.Text =v.ToString();
//textBox5.Text =w.ToString();
//float c=0;
for(j=0;j<3;j++)
{
center[j].a1=0;
center[j].a2=0;
center[j].a3=0;
center[j].a4=0;
}
p=0;
while(p<i)
{
if(paper[p].cla==1)
{
//c=c+paper[p].a1;
center[0].a1 =center[0].a1 +paper[p].a1 ;
center[0].a2 =center[0].a2 +paper[p].a2 ;
center[0].a3 =center[0].a3 +paper[p].a3 ;
center[0].a4 =center[0].a4 +paper[p].a4 ;
u++;
}
else if(paper[p].cla ==2)
{
center[1].a1 =center[1].a1 +paper[p].a1 ;
center[1].a2 =center[1].a2 +paper[p].a2 ;
center[1].a3 =center[1].a3 +paper[p].a3 ;
center[1].a4 =center[1].a4 +paper[p].a4 ;
v++;
}
else if(paper[p].cla==3)
{
center[2].a1 =center[2].a1 +paper[p].a1 ;
center[2].a2 =center[2].a2 +paper[p].a2 ;
center[2].a3 =center[2].a3 +paper[p].a3 ;
center[2].a4 =center[2].a4 +paper[p].a4 ;
w++;
}
p++;
}//while
//c=c/u;
center[0].a1 =center[0].a1/156;
center[0].a2 =center[0].a2/156;
center[0].a3 =center[0].a3/156;
center[0].a4 =center[0].a4/156;
center[1].a1 =center[1].a1/156;
center[1].a2 =center[1].a2/156;
center[1].a3 =center[1].a3/156;
center[1].a4 =center[1].a4/156;
center[2].a1 =center[2].a1/156;
center[2].a2 =center[2].a2/156;
center[2].a3 =center[2].a3/156;
center[2].a4 =center[2].a4/156;
kmeans(center[0].a1,center[0].a2,center[0].a3,center[0].a4,center[1].a1,center[1].a2,center[1].a3,center[1].a4,center[2].a1,center[2].a2,center[2].a3,center[2].a4);
timer1.Enabled=false;
tm=tm*100;
textBox5.Text=tm.ToString();
textBox2.Text=center[0].a1.ToString()+","+center[0].a2.ToString()+","+center[0].a3.ToString()+","+center[0].a4.ToString()+"\r\n";
textBox3.Text=center[1].a1.ToString()+","+center[1].a2.ToString()+","+center[1].a3.ToString()+","+center[1].a4.ToString()+"\r\n";
textBox4.Text=center[2].a1.ToString()+","+center[2].a2.ToString()+","+center[2].a3.ToString()+","+center[2].a4.ToString()+"\r\n";
}
/* public static Encoding GetEncoding(string fileName)
{
return GetEncoding(fileName, Encoding.Default);
}
public static Encoding GetEncoding(FileStream stream)
{
return GetEncoding(stream, Encoding.Default);
}
public static Encoding GetEncoding(string fileName, Encoding defaultEncoding)
{
FileStream fs = new FileStream(fileName, FileMode.Open);
Encoding targetEncoding = GetEncoding(fs, defaultEncoding);
fs.Close();
return targetEncoding;
}
public static Encoding GetEncoding(FileStream stream, Encoding defaultEncoding)
{
Encoding targetEncoding = defaultEncoding;
if(stream != null && stream.Length >= 2)
{
//保存文件流的前4个字节
byte byte1 = 0;
byte byte2 = 0;
byte byte3 = 0;
byte byte4 = 0;
//保存当前Seek位置
long origPos = stream.Seek(0, SeekOrigin.Begin);
stream.Seek(0, SeekOrigin.Begin);
int nByte = stream.ReadByte();
byte1 = Convert.ToByte(nByte);
byte2 = Convert.ToByte(stream.ReadByte());
if(stream.Length >= 3)
{
byte3 = Convert.ToByte(stream.ReadByte());
}
if(stream.Length >= 4)
{
byte4 = Convert.ToByte(stream.ReadByte());
}
//根据文件流的前4个字节判断Encoding
//Unicode {0xFF, 0xFE};
//BE-Unicode {0xFE, 0xFF};
//UTF8 = {0xEF, 0xBB, 0xBF};
if(byte1 == 0xFE && byte2 == 0xFF)//UnicodeBe
{
targetEncoding = Encoding.BigEndianUnicode;
}
if(byte1 == 0xFF && byte2 == 0xFE && byte3 != 0xFF)//Unicode
{
targetEncoding = Encoding.Unicode;
}
if(byte1 == 0xEF && byte2 == 0xBB && byte3 == 0xBF)//UTF8
{
targetEncoding = Encoding.UTF8;
}
//恢复Seek位置
stream.Seek(origPos, SeekOrigin.Begin);
}
return targetEncoding;
}
*/
static void kmeans(float a1,float a2,float a3,float a4,float b1,float b2,float b3,float b4,float c1,float c2,float c3,float c4)
{
string fileName;
Encoding fileEncoding;
string str;
int i;
int j;
int n;
int xun;
int xun1;
int zongshu;
float zuizhi;
float E;
float zuiE;
float[,] shuzhi=new float[N,4];
float[,] paper=new float[3,4];
float[] a=new float[4];
float[,] juli=new float[3,N];
int[] flag=new int[N];
float[,] shu=new float[3,4];
int[] cishu=new int[3];
try
{
paper[0,0]=a1;
paper[0,1]=a2;
paper[0,2]=a3;
paper[0,3]=a4;
paper[1,0]=b1;
paper[1,1]=b2;
paper[1,2]=b3;
paper[1,3]=b4;
paper[2,0]=c1;
paper[2,1]=c2;
paper[2,2]=c3;
paper[2,3]=c4;
xun=0;
E=0;
zuiE=1000000;
while(xun<100)
{
for(i=0;i<3;i++) //得到文档中每个数与三个中心点的距离
{
j=0;
n=0;
fileName=@"C:\balance-scale.data"; //文档名称
fileEncoding = TxtFileEncoding.GetEncoding(fileName, Encoding.GetEncoding("GB2312"));//取得这txt文件的编码
StreamReader sr = new StreamReader(fileName, fileEncoding);//用该编码创建StreamReader
while((str=sr.ReadLine())!=null)
{
a[0]=str[0]-48;
a[1]=str[2]-48;
a[2]=str[4]-48;
a[3]=str[6]-48;
for(int m=0;m<4;m++)
shuzhi[n,m]=a[m];
n++;
juli[i,j]=(float)Math.Sqrt((paper[i,0]-a[0])*(paper[i,0]-a[0])+(paper[i,1]-a[1])*(paper[i,1]-a[1])+(paper[i,2]-a[2])*(paper[i,2]-a[2])+(paper[i,3]-a[3])*(paper[i,3]-a[3]));
// Console.WriteLine("{0}",juli[i,j]);
j++;
}
//Console.WriteLine("#####################");
sr.Close();
}
//###################################
//下面比较每个数距离三个中心点哪个最近,将该中心点代表的类别分配给该数
for(j=0;j<N;j++)
{
zuizhi=100000;
for(i=0;i<3;i++)
if(juli[i,j]<zuizhi)
{
zuizhi=juli[i,j];
flag[j]=i+1;
}
// Console.WriteLine("{0}",flag[j]);
}
//###################################
//计算标准测度函数
E=0;
for(j=0;j<N;j++)
{
if(flag[j]==1)
E=E+(float)(shuzhi[j,0]-paper[0,0])*(shuzhi[j,0]-paper[0,0])+(float)(shuzhi[j,1]-paper[0,1])*(shuzhi[j,1]-paper[0,1])+(float)(shuzhi[j,2]-paper[0,2])*(shuzhi[j,2]-paper[0,2])+(float)(shuzhi[j,3]-paper[0,3])*(shuzhi[j,3]-paper[0,3]);
if(flag[j]==2)
E=E+(float)(shuzhi[j,0]-paper[1,0])*(shuzhi[j,0]-paper[1,0])+(float)(shuzhi[j,1]-paper[1,1])*(shuzhi[j,1]-paper[1,1])+(float)(shuzhi[j,2]-paper[1,2])*(shuzhi[j,2]-paper[1,2])+(float)(shuzhi[j,3]-paper[1,3])*(shuzhi[j,3]-paper[1,3]);
if(flag[j]==3)
E=E+(float)(shuzhi[j,0]-paper[2,0])*(shuzhi[j,0]-paper[2,0])+(float)(shuzhi[j,1]-paper[2,1])*(shuzhi[j,1]-paper[2,1])+(float)(shuzhi[j,2]-paper[2,2])*(shuzhi[j,2]-paper[2,2])+(float)(shuzhi[j,3]-paper[2,3])*(shuzhi[j,3]-paper[2,3]);
}
//Console.WriteLine("{0}",E);
if(zuiE>E)
{
zuiE=E;
xun=0;
}
else
xun++;
if(xun==100)
{
zongshu=0;
j=0;
fileName=@"C:\balance-scale.data"; //文档名称
fileEncoding = TxtFileEncoding.GetEncoding(fileName, Encoding.GetEncoding("GB2312"));//取得这txt文件的编码
StreamReader sr = new StreamReader(fileName, fileEncoding);//用该编码创建StreamReader
while((str=sr.ReadLine())!=null)
{
Console.Write("{0}---",str[8]);
Console.WriteLine("{0}",flag[j]);
xun1=str[8]-48;
if(xun1==flag[j])
zongshu++;
j++;
}
sr.Close();
Console.WriteLine("zongshu:{0}",zongshu);
Console.WriteLine("baifenbi:{0}",(float)zongshu/N);
}
//###################################
for(j=0;j<N;j++)
{
if(flag[j]==1)
{
shu[0,0]+=shuzhi[j,0];
shu[0,1]+=shuzhi[j,1];
shu[0,2]+=shuzhi[j,2];
shu[0,3]+=shuzhi[j,3];
cishu[0]++;
}
if(flag[j]==2)
{
shu[1,0]+=shuzhi[j,0];
shu[1,1]+=shuzhi[j,1];
shu[1,2]+=shuzhi[j,2];
shu[1,3]+=shuzhi[j,3];
cishu[1]++;
}
if(flag[j]==3)
{
shu[2,0]+=shuzhi[j,0];
shu[2,1]+=shuzhi[j,1];
shu[2,2]+=shuzhi[j,2];
shu[2,3]+=shuzhi[j,3];
cishu[2]++;
}
}
paper[0,0]=(float)(shu[0,0]/cishu[0]);
paper[0,1]=(float)(shu[0,1]/cishu[0]);
paper[0,2]=(float)(shu[0,2]/cishu[0]);
paper[0,3]=(float)(shu[0,3]/cishu[0]);
paper[1,0]=(float)(shu[1,0]/cishu[1]);
paper[1,1]=(float)(shu[1,1]/cishu[1]);
paper[1,2]=(float)(shu[1,2]/cishu[1]);
paper[1,3]=(float)(shu[1,3]/cishu[1]);
paper[2,0]=(float)(shu[2,0]/cishu[2]);
paper[2,1]=(float)(shu[2,1]/cishu[2]);
paper[2,2]=(float)(shu[2,2]/cishu[2]);
paper[2,3]=(float)(shu[2,3]/cishu[2]);
}
}
catch(Exception e)
{
Console.WriteLine("An exception was thrown.Message was"+e.Message);
}
}
public class TxtFileEncoding
{
public static Encoding GetEncoding(string fileName)
{
return GetEncoding(fileName, Encoding.Default);
}
public static Encoding GetEncoding(FileStream stream)
{
return GetEncoding(stream, Encoding.Default);
}
public static Encoding GetEncoding(string fileName, Encoding defaultEncoding)
{
FileStream fs = new FileStream(fileName, FileMode.Open);
Encoding targetEncoding = GetEncoding(fs, defaultEncoding);
fs.Close();
return targetEncoding;
}
public static Encoding GetEncoding(FileStream stream, Encoding defaultEncoding)
{
Encoding targetEncoding = defaultEncoding;
if(stream != null && stream.Length >= 2)
{
//保存文件流的前4个字节
byte byte1 = 0;
byte byte2 = 0;
byte byte3 = 0;
byte byte4 = 0;
//保存当前Seek位置
long origPos = stream.Seek(0, SeekOrigin.Begin);
stream.Seek(0, SeekOrigin.Begin);
int nByte = stream.ReadByte();
byte1 = Convert.ToByte(nByte);
byte2 = Convert.ToByte(stream.ReadByte());
if(stream.Length >= 3)
{
byte3 = Convert.ToByte(stream.ReadByte());
}
if(stream.Length >= 4)
{
byte4 = Convert.ToByte(stream.ReadByte());
}
//根据文件流的前4个字节判断Encoding
//Unicode {0xFF, 0xFE};
//BE-Unicode {0xFE, 0xFF};
//UTF8 = {0xEF, 0xBB, 0xBF};
if(byte1 == 0xFE && byte2 == 0xFF)//UnicodeBe
{
targetEncoding = Encoding.BigEndianUnicode;
}
if(byte1 == 0xFF && byte2 == 0xFE && byte3 != 0xFF)//Unicode
{
targetEncoding = Encoding.Unicode;
}
if(byte1 == 0xEF && byte2 == 0xBB && byte3 == 0xBF)//UTF8
{
targetEncoding = Encoding.UTF8;
}
//恢复Seek位置
stream.Seek(origPos, SeekOrigin.Begin);
}
return targetEncoding;
}
}
private void Form1_Load(object sender, System.EventArgs e)
{
}
private void textBox4_TextChanged(object sender, System.EventArgs e)
{
}
private void textBox2_TextChanged(object sender, System.EventArgs e)
{
}
private void timer1_Tick(object sender, System.EventArgs e)
{
tm++;
}
private void textBox5_TextChanged(object sender, System.EventArgs e)
{
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -