当前位置: 代码迷 >> PB >> 求各大神帮助!运用数据窗口技术进行K均值算法实现
  详细解决方案

求各大神帮助!运用数据窗口技术进行K均值算法实现

热度:139   发布时间:2016-04-29 05:32:57.0
求各大神相助!!运用数据窗口技术进行K均值算法实现
k均值算法大体步骤是这样的:
1、数据规格化     (x-x所在列的min)/(x所在列的max-x所在列的min)*某比例
2、任取k<N,我这个就先设k=4吧,任选4行作为初始聚类中心,计算其他行到这4行的欧几里得距离d = √( (x1-y1)2+(x2-y2)2+...+(xn-yn)2 ),离哪初始哪行最近就归为一类,最后分成4类,再计算每类距离的平均值,得到新的聚类中心,再次计算距离,若得到的新的分类与之前一样则停止计算,若不一样,继续计算每类距离的平均值,得到新的聚类中心,计算距离。这样循环,直到分类不再变化。

目前进展:
规格化那边似乎数据类型出现了问题,一直出错。求大神帮忙把接下来的语言大致写下来,或者把思路和需用到的函数写一下,pb菜鸟实在是编不下去了~~>_<~~~小女纸感激不尽啊   

string s1[],s2[],s3[],s4[],s5[],s6[],c1[],c2[],c3[],c4[],c5[],c6[]
string min1,max1,min2,max2,min3,max3,min4,max4,min5,max5,min6,max6
int i,totalrow

totalrow=dw_1.rowcount()
if totalrow <>0 then
for i=1 to totalrow
s1[i]=dw_1.GetItemstring(i,"保税件数")
s2[i]=dw_1.GetItemstring(i,"保税货物净重")
s3[i]=dw_1.GetItemstring(i,"非保税件数")
s4[i]=dw_1.GetItemstring(i,"非保税货物净重")
s5[i]=dw_1.GetItemstring(i,"对装卸速度要求")
s6[i]=dw_1.GetItemstring(i,"对价格的看法")
  if s5[i] = "在意"  then
dw_1.setitem(i,"对装卸速度要求","1")
else 
dw_1.setitem(i,"对装卸速度要求","0")
end if
if s6[i] = "在意"  then
dw_1.setitem(i,"对价格的看法","1")
else 
dw_1.setitem(i,"对价格的看法","0")
end if
min1=dw_1.describe("evaluate('min(保税件数)',1)")
max1=dw_1.describe("evaluate('max(保税件数)',1)")
min2=dw_1.describe("evaluate('min(保税货物净重)',1)")
max2=dw_1.describe("evaluate('max(保税货物净重)',1)")
min3=dw_1.describe("evaluate('min(非保税件数)',1)")
max3=dw_1.describe("evaluate('max(非保税件数)',1)")
min4=dw_1.describe("evaluate('min(非保税货物净重)',1)")
max4=dw_1.describe("evaluate('max(非保税货物净重)',1)")
min5=dw_1.describe("evaluate('min(对装卸速度要求)',1)")
max5=dw_1.describe("evaluate('max(对装卸速度要求)',1)")
min6=dw_1.describe("evaluate('min(对价格的看法)',1)")
max6=dw_1.describe("evaluate('max(对价格的看法)',1)")

// c1[i]=(s1[i]-min1)/(max1-min1)*0.2   //规格化

   next
end if
------解决方案--------------------
啥意思?你要的是这个:

long r
string result,expression,colname

colname = '保税件数'
expression = '('+colname+' - min('+colname+' for all))/(max('+colname+' for all) - min('+colname+' for all))*0.2'

for r = 1 to dw_3.RowCount()
result = dw_3.Describe("evaluate('"+expression+"',"+string(r)+")")
messagebox(string(r),result)
next

------解决方案--------------------
如果按你的写法:
c1[i]=(s1[i]-min1)/(max1-min1)*0.2
应该类型转换一下:
c1[i]=string((dec(s1[i])-dec(min1))/(dec(max1)-dec(min1))*0.2)
------解决方案--------------------
引用:
还有个问题就是我用max函数得到的最大值总是不正确,求大神解释指导

如果min函数结果没错那么max函数结果没可能会错,一定是哪里出了问题……
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

还有个问题就是我用max函数得到的最大值总是不正确,求大神解释指导

如果min函数结果没错那么max函数结果没可能会错,一定是哪里出了问题……


得到的只是这列中的某个值,并非最大的那个值,请问可能是什么原因?

估计是你的数据类型不是dec类型的,比如说是char类型:9>10这样吧?
具体要看你数据窗口的定义和你的数据
------解决方案--------------------
引用:
Quote: 引用:

如果按你的写法:
c1[i]=(s1[i]-min1)/(max1-min1)*0.2
应该类型转换一下:
c1[i]=string((dec(s1[i])-dec(min1))/(dec(max1)-dec(min1))*0.2)



谢谢大神!这样写的确不报错了!但是执行后会出现SQLSTATE = 22001,[Sybase][ODBC Driver][SQL Anywhere]字符串数据右截断。请问该如何处理?  还有我MAX函数得到的最大值不正确,只是这列中的某个值,并非最大的那个值,请问可能是什么原因?


你这个应该是把c1又写回到数据窗口里面然后更新而且c1是字符串类型?检查一下比如c1对应的column是col1的话检查一下col1的数据长度,然后根据长度确定你要保留的小数位数,比如col1是10个字符那么:c1[i]=string((dec(s1[i])-dec(min1))/(dec(max1)-dec(min1))*0.2.'0.0000000')小数点后取6-7位应该没问题
------解决方案--------------------
引用:
Quote: 引用:

估计是你的数据类型不是dec类型的,比如说是char类型:9>10这样吧?
具体要看你数据窗口的定义和你的数据


我数据库中的数据类型都定义的是verchar,请问我现在该如何更改?我真的超级菜。。。对编程只是刚入门。。。谢谢大神不厌其烦解答

一般来说数值型的存储类型就用decimal(....)就行,除非你是外部采集的数据有时候会有不合法的字符,一般人工输入都用decimal
可以有几种方法来解决这个问题:
第一就是改数据库中的列类型,也分两个情况:a,没有非法字符,可以直接改;b,有非法字符,可以新建一张表,然后把合法的旧数据导进去
第二种就是在数据窗口中处理,所有的max,min函数里面都要改成:max(dec(保税件数) for all)这样子
第三种方法可以在数据库中建一个view,使用类似这样的SQL:

select case when ISNUMERIC(保税件数)=1 then CONVERT(dec(18,5),保税件数) else 0 end as "保税件数"....

.....
以上1、3方法仅限SQLServer,其他数据库没试过
------解决方案--------------------
引用:
Quote: 引用:

一般来说数值型的存储类型就用decimal(....)就行,除非你是外部采集的数据有时候会有不合法的字符,一般人工输入都用decimal
可以有几种方法来解决这个问题:
第一就是改数据库中的列类型,也分两个情况:a,没有非法字符,可以直接改;b,有非法字符,可以新建一张表,然后把合法的旧数据导进去
第二种就是在数据窗口中处理,所有的max,min函数里面都要改成:max(dec(保税件数) for all)这样子
第三种方法可以在数据库中建一个view,使用类似这样的SQL:

select case when ISNUMERIC(保税件数)=1 then CONVERT(dec(18,5),保税件数) else 0 end as "保税件数"....
  相关解决方案