[Stove AI] Машинное обучение 020-Использование алгоритма K-средних для кластерного анализа данных
(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)
Предыдущие статьи по машинному обучению (с номерами 010-019) посвященыконтролируемое обучение, но начиная с этой статьи старый мальчишка алхимии начнет объяснятьнеконтролируемое обучениеС точки зрения неконтролируемого обучения это означает, что обработанные данные не помечены ни в какой форме, и мы не реализуем классификацию набора обучающих данных, поэтому это эквивалентно размазыванию, Чтобы машинное обучение узнало категорию выборки само собой, то машинное обучение проходит Как узнать "в категории"? Это роль алгоритма кластеризации.
Основная идея алгоритма кластеризации заключается в том, что в Китае «люди группируются в группы, а объекты делятся на группы», то есть машинное обучение будет использовать определенный алгоритм для разделения выборок на категории, чтобысходствоОбразцы делятся на классы,не похожеОбразцы делятся на разные категории.
Алгоритм K-средних является одним из самых популярных алгоритмов кластеризации. Этот алгоритм часто использует различные атрибуты данных для разделения входных данных на группы K. Это разделение достигается с помощью оптимизированного метода, так что точки данных в каждой группе сумма квадратов расстояний от центральной точки группы минимизируется.
Это звучит очень абстрактно и заставляет людей чувствовать туман, поэтому давайте рассмотрим простой пример.
1. Подготовьте набор данных
Набор данных, использованный на этот раз, — моя предыдущая статья.[Искусственный интеллект плиты] Машинное обучение 010 — Решение задач множественной классификации с помощью наивных байесовских классификаторовНабор данных, используемый в , небольшой набор данных с четырьмя разными категориями и двумя разными функциями, его метод загрузки и метод отображения следующие.
# 准备数据集
data_path='E:\PyProjects\DataSet\FireAI/data_multivar.txt'
df=pd.read_csv(data_path,header=None)
# print(df.head())
# print(df.info()) # 查看数据信息,确保没有错误
dataset_X,dataset_y=df.iloc[:,:-1],df.iloc[:,-1]
# print(dataset_X.head())
print(dataset_X.info())
print('-'*100)
print(dataset_y.head())
dataset_X=dataset_X.values
dataset_y=dataset_y.values
# print(dataset_X.shape) # (400, 2)
# print(dataset_y.shape) # (400,)
------------------------------------- потерять-- ------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 400 entries, 0 to 399
Data columns (total 2 columns):
0 400 non-null float64
1 400 non-null float64
dtypes: float64(2)
memory usage: 6.3 KB
None
--------------------------------------------Заканчивать----- --------------------
Указывает, что результирующий набор данных был правильно загружен в память, и что в каждой функции нет значений Null, нам не нужно выполнять дальнейшую обработку отсутствующих значений.
Давайте визуализируем этот набор данных в 2D, Ниже приведен код визуализации:
# 无标签数据集可视化,将第一列feature作为X,第二列feature作为y
def visual_2D_dataset_dist(dataset):
'''将二维数据集dataset显示在散点图中'''
assert dataset.shape[1]==2,'only support dataset with 2 features'
plt.figure()
X=dataset[:,0]
Y=dataset[:,1]
plt.scatter(X,Y,marker='v',c='g',label='dataset')
X_min,X_max=np.min(X)-1,np.max(X)+1
Y_min,Y_max=np.min(Y)-1,np.max(Y)+1
plt.title('dataset distribution')
plt.xlim(X_min,X_max)
plt.ylim(Y_min,Y_max)
plt.xlabel('feature_0')
plt.ylabel('feature_1')
plt.legend()
visual_2D_dataset_dist(dataset_X)
Полученный результат выглядит следующим образом:
########################резюме############## #######
1. Загрузка этого набора данных очень проста, и его можно загрузить напрямую с помощью Pandas, и никакой другой обработки не требуется.
2. Здесь следует отметить, что двумерная плоскостная визуализация неразмеченных наборов данных не может использовать данные меток, поэтому функция визуализации здесь отличается от функции визуализации в моих предыдущих статьях, и здесь требуется дополнительное внимание.
3. Как видно из двумерного плоского графика рассеяния, этот набор данных можно условно разделить на 4 разные категории, то есть данные распределены по четырем группам, что является основанием для использования нами К-среднего алгоритм.
########################################################
2. Создайте алгоритм K-средних
Процесс построения алгоритма K-средних очень прост.Как и другие SVM, алгоритм случайного леса строится таким же образом, а именно:
# 定义一个k-means对象
from sklearn.cluster import KMeans
kmeans=KMeans(init='k-means++',n_clusters=4,n_init=10)
# 这几个参数是初始化设定的,其中n_clusters是从二维散点图中看出大概有4个族群
kmeans.fit(dataset_X)
------------------------------------- потерять-- ----------------
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=4, n_init=10, n_jobs=1, precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)
--------------------------------------------Заканчивать----- ----------------
Хотя здесь мы определили объект KMeans и обучили наш неразмеченный набор данных, как насчет результатов обучения? Как узнать, правильно ли алгоритм k-средних разделяет разные классы?
Итак, нам нужен визуальный результат, как и график результатов классификации SVM, упомянутый в предыдущей статье, здесь мы определяем функцию, предназначенную для визуализации результатов кластеризации K-средних, и используем эту функцию для просмотра кластеризации здесь Эффект. код показывает, как показано ниже:
def visual_kmeans_effect(k_means,dataset):
assert dataset.shape[1]==2,'only support dataset with 2 features'
X=dataset[:,0]
Y=dataset[:,1]
X_min,X_max=np.min(X)-1,np.max(X)+1
Y_min,Y_max=np.min(Y)-1,np.max(Y)+1
X_values,Y_values=np.meshgrid(np.arange(X_min,X_max,0.01),
np.arange(Y_min,Y_max,0.01))
# 预测网格点的标记
predict_labels=k_means.predict(np.c_[X_values.ravel(),Y_values.ravel()])
predict_labels=predict_labels.reshape(X_values.shape)
plt.figure()
plt.imshow(predict_labels,interpolation='nearest',
extent=(X_values.min(),X_values.max(),
Y_values.min(),Y_values.max()),
cmap=plt.cm.Paired,
aspect='auto',
origin='lower')
# 将数据集绘制到图表中
plt.scatter(X,Y,marker='v',facecolors='none',edgecolors='k',s=30)
# 将中心点回执到图中
centroids=k_means.cluster_centers_
plt.scatter(centroids[:,0],centroids[:,1],marker='o',
s=100,linewidths=2,color='k',zorder=5,facecolors='b')
plt.title('K-Means effect graph')
plt.xlim(X_min,X_max)
plt.ylim(Y_min,Y_max)
plt.xlabel('feature_0')
plt.ylabel('feature_1')
plt.show()
visual_kmeans_effect(kmeans,dataset_X)
########################резюме############## #####
1. Метод определения алгоритма кластеризации K-средних очень прост. Вам нужно только импортировать KMeans из sklearn.cluster и определить объект KMeans. Вы можете напрямую обучить его с помощью функции fit().
2. Данные группируются с использованием алгоритма кластеризации k-средних.Вы можете использовать функцию visual_kmeans_effect() для непосредственного просмотра карты кластеризованного эффекта.
3. Хотя рендеринг можно увидеть интуитивно, по-прежнему сложно количественно оценить точность алгоритма кластеризации k-средних, что будет объяснено в последующих статьях.
#######################################################
Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.
Использованная литература:
1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.