📄 dbscan.jsp
字号:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="com.mysql.jdbc.Driver" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> DBSCAN算法实现 </TITLE>
<META NAME="Author" CONTENT="方泽明@hubu.edu.cn">
<META NAME="Keywords" CONTENT="dbscan算法">
<META NAME="Description" CONTENT="本程序将实现dbscan算法.该算法依次考察每个对象在半径e内的对象的个数,并将数目大于最少数目MinPts的对象称为核心对象,将核心对象半径e内的所有对象作为一个簇.">
</HEAD>
<BODY>
<% //定义全局变量
String Pronum=request.getParameter("MaxPronum"); //记录的属性个数
String Objnum=request.getParameter("MaxObjnum"); //记录的个数
String stre=request.getParameter("e"); //半径的大小
String strMinPts=request.getParameter("MinPts");
Integer MaxPronum=Integer.parseInt(Pronum);
Integer MaxObjnum=Integer.parseInt(Objnum);
Integer e=Integer.parseInt(stre);
Integer MinPts=Integer.parseInt(strMinPts);
%>
<%
//连接数据库
String driverName="com.mysql.jdbc.Driver";//驱动程序名
String userName="fangzm"; //数据库用户名
String userPasswd="fang"; //密码
String dbName="transaction"; //数据库名
String tableName="dbscan"; //表名
String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection connection=DriverManager.getConnection(url);
Statement statement = connection.createStatement();
//获得数据结果集
String sql="SELECT * FROM "+tableName;
ResultSet rs = statement.executeQuery(sql);
int []kind=new int[MaxObjnum+1]; //标记每一个记录是否是核心对象(值与下标相等),是否已被处理(初始值为0,否则值为所属类别编号)
for(int i=0;i<=MaxObjnum;i++)
kind[i]=0;
out.println("<table border><tr><td>核心对象id</td><td>在半径="+e+"内的所有对象id</td><td>对象数目</td></tr>");
for(int i=1;i<=MaxObjnum;i++)
{
if(kind[i]==0)
{
int []recond=new int[MaxPronum]; //当前记录的属性值
int []temp=new int[MaxPronum]; //临时存入用于计算的记录的属性值
int near=0; //当前记录半径e内的记录数目
int []nearid=new int[MaxObjnum]; //当前记录半径e内的记录id
rs.absolute(i);
for(int j=0;j<MaxPronum;j++)
recond[j]=rs.getInt(j+2);
rs.beforeFirst(); //扫描数据库;
while(rs.next())
{
if(kind[rs.getInt(1)]==0) //只考虑未处理过的记录
{
for(int j=0;j<MaxPronum;j++)
temp[j]=rs.getInt(j+2);
int E=0;
for(int j=0;j<MaxPronum;j++) //计算两个记录之前的距离的平方
E+=Math.pow(recond[j]-temp[j],MaxPronum);
if(E<Math.pow(e,MaxPronum))
nearid[near++]=rs.getInt(1);
}
}
if(near>=MinPts) //若为核心对象
{
out.println("<tr><td>"+i+"</td><td>");
int j=0;
while(nearid[j]!=0)
{
kind[nearid[j]]=i;
out.println(nearid[j]);
j++;
}
out.println("</td><td>"+j+"</td></tr>");
}
}
}
out.println("</table>");
rs.close();
statement.close();
connection.close();
out.println("<p>以下是未划分簇的对象id(即孤立点):");
for(int i=1;i<=MaxObjnum;i++)
if(kind[i]==0)
out.println(i);
%>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -