python图像LLE降维K-means聚类

实现目标:

  • 对花的图片集进行LLE降维
  • 完成图片K-means聚类
  • 绘制系统聚类图

首先加载本地图片集

#导入本地图片集
import os
import cv2
array_of_img = [] #用于储存图片
#此函数用于读取图片,参数为本地路径名
def read_directory(directory_name):
    #循环读取这个路径中的每个图像
    for filename in os.listdir(directory_name):
        #print(filename)
        #img用于储存图像数据
        img = cv2.imread(directory_name + "/" + filename)#根据文件夹名称与文件名进行图像的读取
        array_of_img.append(img) #将图像数据存储到array_of_img中
        #print(img)
        #print(array_of_img)

调用函数

#使用read_directory函数加载本地图片集,图片放在D盘下的flowerpictures文件夹
read_directory('D:/flowerpictures/')

其次对图片集进行LLE降维

sklearn的manifold提供了LLE方法(LocallyLinearEmbedding)

n_neighbors:即我们搜索样本的近邻的个数,最重要的就是这个,默认值是5。n_neighbors个数越大,则建立样本局部关系的时间会越大,也就意味着算法的复杂度越大;同时n_neighbors个数越大,则降维后样本的局部关系会保持的更好。一般来说,如果算法运行时间可以接受,我们可以尽量选择一个比较大一些的n_neighbors。

n_components:即我们降维到的维数。如果我们降维的目的是可视化,则一般可以选择2-5维。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import NullFormatter
#sklearn的manifold提供了LLE方法(LocallyLinearEmbedding)
from sklearn import manifold, datasets

#处理图片集样本
n_points = len(array_of_img)
X, color = datasets.samples_generator.make_s_curve(n_points, random_state=0)
n_neighbors = 5

# LLE降维
n_components = 2 #保留2个主成分
Y = manifold.LocallyLinearEmbedding(n_neighbors, n_components).fit_transform(X)
#print(Y)

最后K-means聚类,并可视化聚类效果

import numpy as np
from sklearn.cluster import KMeans

#构造一个聚类数为3的聚类器
estimator = KMeans(n_clusters=3)#构造聚类器
estimator.fit(Y)#对降维后的图像数据Y进行聚类
label_pred = estimator.labels_ #获取聚类标签
centroids = estimator.cluster_centers_ #获取聚类中心
inertia = estimator.inertia_ # 获取聚类准则的总和

#设定不同的聚类数值k以运算
for k in range(2,10):
	clf = KMeans(n_clusters=k) #调用KMeans算法,聚类数为k
	s = clf.fit(Y) #加载数据集合
	numSamples = len(Y)
	centroids = clf.labels_
	print(centroids) #显示中心点
	print(clf.inertia_)  #显示聚类效果
	mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', ', 'pr']
	#画出所有样例点 属于同一分类的绘制同样的颜色
	for i in range(numSamples):
		#markIndex = int(clusterAssment[i, 0])
		plt.plot(Y[i][0], Y[i][1], mark[clf.labels_[i]]) #mark[markIndex])
	mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', ', 'pb']
	#画出质点,用特殊图型
	centroids =  clf.cluster_centers_
	for i in range(k):
		plt.plot(centroids[i][0], centroids[i][1], mark[i], markersize = 12)
		#print centroids[i, 0], centroids[i, 1]
	plt.show()

实现结果如图
python图像LLE降维K-means聚类_第1张图片
python图像LLE降维K-means聚类_第2张图片
python图像LLE降维K-means聚类_第3张图片
python图像LLE降维K-means聚类_第4张图片
python图像LLE降维K-means聚类_第5张图片
python图像LLE降维K-means聚类_第6张图片
python图像LLE降维K-means聚类_第7张图片
python图像LLE降维K-means聚类_第8张图片
感谢学习指导:
python读取文件夹下所有图片

人工智障学习笔记——机器学习(13)LLE降维

k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)

你可能感兴趣的:(python)