⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 数据挖掘中的一个聚类算法k-means。
💻 CS
📖 第 1 页 / 共 2 页
字号:
				{

					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 + -