紧邻算法分类器之模拟图(实现模拟)(三)

来源:互联网 发布:如何改淘宝的主营类目 编辑:程序博客网 时间:2024/05/18 00:46

    pl.legend()函数是显示图例,值得注意的是,plot函数,是通过点在坐标中出现的位置直线,如x=(1,4,3),y=(1,5,2),则先连接(1,1)和(4,5),然后连接(3,2)这样会出现杂乱无章的图形,所以,在通过数据库选出坐标后,通过属性从小到大排序,是横坐标的顺序是从小到大的。

显示结果如下:


书上的图:


两图仍有区别,如果要产生下图的形状,要使用函数模型(个人理解),暂时没有实施

程序

import pymssqlfrom numpy import * import matplotlib.pylab as pldef GetDataExecute(str):               #该函数是为了通过sql语句获取数据    conn=pymssql.connect(host='localhost',database='test',user='sa',password='123')    cur=conn.cursor()    cur.execute(str)                                 d= cur.fetchall()#数据读入d中,在最后返回    conn.commit()        cur.close()    conn.close()      return ddef GetCoordinate(key):           #通过传入属性值,组成相应的sql语句,以免,对不同的属性重复写代码,可以,将该函数再进一步的改进,传入属性和标签名,这样,函数将#更加简洁    setosa = """select %s, count(%s)as feq from iris where class_label='Iris-setosa' group by %s order by  %s""" % (key,key,key,key)    versicolor = """select %s, count(%s)as feq from iris where class_label='Iris-versicolor' group by %s order by  %s""" % (key,key,key,key)    virginica = """select %s, count(%s)as feq from iris where class_label='Iris-virginica' group by %s order by  %s""" % (key,key,key,key)    setosa_data = GetDataExecute(setosa)    versicolor_data=GetDataExecute(versicolor)    virginica_data=GetDataExecute(virginica)        setosa_x=[xi[0]for xi in setosa_data]    setosa_y=[yi[1]for yi in setosa_data]        versicolor_x=[xi[0]for xi in versicolor_data]    versicolor_y=[yi[1]for yi in versicolor_data]        virginica_x=[xi[0]for xi in virginica_data]    virginica_y=[yi[1]for yi in virginica_data]            l= list()    l.append((setosa_x,setosa_y,"setosa"))    l.append((versicolor_x,versicolor_y,"versicolor"))    l.append((virginica_x,virginica_y,"virginica"))        return l#以下是获取坐标,放入list中data = list()data.append(GetCoordinate("sepal_length"))data.append(GetCoordinate("sepal_width"))data.append(GetCoordinate("petal_length"))data.append(GetCoordinate("petal_width"))position = 0for d in data:    ax = fig.add_subplot(2,2,position+1)#position是画图的位置,2,2表示是2行两列的图        pl.plot(d[0][0],d[0][1],'b--',label="$"+ d[0][2] +"$",color="blue",linewidth=2)    pl.plot(d[1][0],d[1][1],'k--',label="$"+ d[1][2] +"$",color="black",linewidth=2)    pl.plot(d[2][0],d[2][1],'r',label="$"+ d[2][2] +"$",linewidth=2)    pl.legend()    position +=1fig.subplots_adjust(hspace=1) #加入一行的间隔pl.show()        #显示