python web开发框架(Python中使用K-means算法)
导读:k-means是机器学习中最常用的聚类算法,关于k-means算法的数学原理、算法、伪码等已有相当丰富的文献,在此不再赘述。...
k-means是机器学习中最常用的聚类算法 ,关于k-means算法的数学原理 、算法 、伪码等已有相当丰富的文献 ,在此不再赘述 。
1 、调用以下库
importnumpyasnp#用于抽样和生成随机数 fromsklearn.clusterimportKMeans#sklearn自带的Kmeans算法,用于严重本文算法结果是否正确 importmatplotlib.pyplotasplt#结果可视化 importsys#需要用到sys.exit()函数若不需要验证聚类结果是否可以不使用Sklearn库 。
2 、生成用于训练的随机数据
np.set_printoptions(suppress=True)#令numpy的结果不以科学计数法的方式输出 Data=np.array([[1.0,2.0],[1.5,1.8],[3,4],[6,8],[8,8],[1,0.6], [9,11],[7,10]])#你也可以通过抽样的方式来更快的获得测试数据3 、定义用于选择随机初始点和簇数(k)的函数
defK_means(data,k): globalMean mean=[] a=np.max(data[:,0]) b=np.min(data[:,0]) c=np.max(data[:,1]) d=np.min(data[:,1]) foriinrange(k): x=np.random.uniform(a,b,1) #此处返回array y=np.random.uniform(c,d,1)#此处返回array mean.append([float(x),float(y)]) Mean=np.array(mean) returnMean在上面的代码中,为了限定初始点(x,y)的位置不会超出样本点的范围 ,因此均匀抽样的上下限是指训练数据(a,b)和(c,d)的最小横距。
4 、定义可视化函数, 绘制测试数据散点图
defvision(data,cell): plt.figure(figsize=(12,6)) ax1=plt.subplot(121) ax1.scatter(Data[:,0],Data[:,1])#原始数据散点图 ax1.scatter(point[:,0],point[:,0])#同时将随机选取的初始点表示出来 plt.xlabel("x") plt.ylabel("y") plt.title("scatterof"+"rural"+"data") ax2=plt.subplot(122) ax2.scatter(Data[:,0],Data[:,1])#原始数据散点图 ax2.scatter(data[:,0],data[:,1])#经过迭代后最终确定的聚类点 plt.xlabel("x") plt.ylabel("y") plt.title("scatterof"+cell+"data") plt.show()聚类结果的可视化对于判断聚类结果的准确性至关重要 。
5 、定义迭代过程, 通过不断计算各个样本对聚类点的欧式聚类, 来不断更新聚类点
defiteration(Data,point): A=[] B=[] foriinrange(len(Data)): d1=np.sqrt(sum(pow(Data[i]-point[0],2))) d2=np.sqrt(sum(pow(Data[i]-point[1],2))) ifd1>d2: A.append(list(Data[i])) else: B.append(list(Data[i])) iflen(A)==len(Data)orlen(B)==len(Data): print("初始化错误") sys.exit(0) new_x1=np.mean(np.array(A)[:,0]) new_y1=np.mean(np.array(A)[:,1]) new_x2=np.mean(np.array(B)[:,0]) new_y2=np.mean(np.array(B)[:,1]) new_point=np.array([[new_x1,new_y1],[new_x2,new_y2]]) returnnew_point注意, 上段代码中加入了一个if语句
iflen(A)==len(Data)orlen(B)==len(Data): print("初始化错误") sys.exit(0)由于初始点是随机产生的 ,所以这个条件语句是非常必要的 ,因此有可能所有的样本点都只接近一个聚类中心而远离另一个聚类中心 ,这样就不能形成两个聚类中心 ,程序将会报错 ,因此我们需要排除出现这种情况的可能性 。一旦所有样本点都接近一个聚类中心时令程序停止 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!