K-means聚类分析属于非层次聚类法的一种。首先选择某些记录作为凝聚点(可人为指定),按就近原则将其余记录向凝聚点凝集,计算出各个处室分类的中心位置(均值),用计算出的中心位置重新进行聚类,如此循环反复,知道凝聚点位置收敛为止。
一.基本原理实例kmeans算法又名k均值算法,K-means算法中的k表示的是聚类为k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。
其算法思想大致为:先从样本集中随机选取 k个样本作为簇中心,并计算所有样本与这 k个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中,对于新的簇计算各个簇的新的“簇中心”。
————————————————
版权声明:本文为CSDN博主「Best-yz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43741312/article/details/97128745
import numpy as np
from scipy.cluster.vq import vq,kmeans,whiten
import matplotlib.pyplot as plt
#样本数据
fe=np.array([[1.6,2.3],[0.5,0.8],[0.1,2.8],[3.5,5.6],[0.6,0.7]])
#选择出初始化的凝聚中心K
book=np.array((fe[0],fe[1]))
print("book:n",book)
#计算数值之间的距离
codebook,distortion=kmeans(fe,book)
print(kmeans(fe,book))
print("codebook:",codebook)
print("distortion:",distortion)
#将各个数据点再图里呈现
plt.scatter(fe[:,0],fe[:,1],c='g')
plt.scatter(codebook[:,0],codebook[:,1],c="r")
plt.show
二.对一张图片的色彩聚类
1.用PIL生成小尺寸图片,准备在缩略图上进行聚类。并且得出图片色彩的数据值。
im=np.array(Image.open("logo.png"))
def colorz(filename,n=3):
img=Image.open(filename)
img.thumbnail((200,200))
w,h=img.size
print(w,h)
print("w*h=",w*h)
plt.axis("off")
plt.imshow(img)
plt.show()
points=[]
for cout,color in img.getcolors(w*h):
points.append(color)#将图片颜色数据装入列表
return points
colorz("logo.png",3)
2.对色彩聚类
points=colorz("logo.png",3)
fe=np.array(points,dtype=float)
book=np.array((fe[100],fe[1],fe[8],fe[8]))
codebook,distortion=kmeans(fe,7)
centers=np.array(codebook,dtype=int)
fe=np.array(points)
plt.scatter(fe[:,0], fe[:,2], c='b')
plt.scatter(codebook[:, 0], codebook[:,2], c='r') #聚类中心
plt.show()
- 承接上步colorz自定义函数,通过float方法处理数据,因为聚类数据需要时Float或者是Double
- 确定聚类中心,放入book
- kmeans(fe,7),7是聚类中心个数
- 聚类结束,若想在图里显示色彩,还得转为整数
运行结果:红色为七个聚类中心。
3.合并到FLlask软件中
julei.py文件:
from flask import Flask,render_template
import numpy as np
from scipy.cluster.vq import vq,kmeans,whiten
from PIL import Image
app=Flask(__name__)
def colorz(filename,n=3):
img=Image.open(filename)
img=img.rotate(-90)
img.thumbnail((200,200))
w,h=img.size
points=[]
for cout,color in img.getcolors(w*h):
points.append(color)
return points
def kmeansColor(img,n):
points=colorz(img,3)
fe = np.array(points, dtype=float)
codebook, distortion = kmeans(fe, 7)
centers = np.array(codebook, dtype=int)
return centers
@app.route('/')
def julei():
#genframe()
imgcolors=kmeansColor("static/all/image100.jpg",5)
return render_template("julei.html",imgcolors=imgcolors)
if "__main__"==__name__:
app.run(port="0723")
julei.html文件:
spicy
{{imgcolors}}
{% for c in imgcolors %}
颜色
{% endfor %}
结果:



