实现目标:
首先加载本地图片集
#导入本地图片集
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读取文件夹下所有图片
人工智障学习笔记——机器学习(13)LLE降维
k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)