无监督学习(unsupervised learning)
在无监督学习中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。
聚类(clustering)
聚类算法的目标是将数据集合分成若干簇,使得同一簇内的数据点相似度尽可能大,而不同簇间的数据点相似度尽可能小。
聚类要求
k-均值算法(k-means)---基于原型的聚类
K-Means算法是一种较典型的逐点修改迭代的动态聚类算法
1.首先从d维空间中选择k个数据点作为初始聚类的均值(中心)/簇
2.计算每个数据点到这些聚类中心的距离,然后把各个数据点分配给离它最近的那个聚类
3.如果所有数据点都不再被重新分配,难么就停止并保持现有聚类
4.如果仍有数据点被重新分配,则重新计算均值,并返回到第2步
由于每次都要计算所有的样本与每一个质心之间的距离,因此在大规模的数据集上,K-Means算法的收敛速度比较慢。
最优的聚类结果需要符合以 下两个假设
1.“簇中心点”(cluster center)是属于该簇的所有数据点坐标的算术平均值。
- 一个簇的每个点到该簇中心点的距离,比到其他簇中心点的距离短。
k=2 N=14
k=3
一种用于度量聚类效果的指标是SSE(SumofSquaredError,误差平方和),SSE值越小表示数据点越接近它们的质心,聚类效果也越好。因此建议对数据进行标准化以使其平均值为零,标准差为1。
K-Means算法的局限性
1.聚类中心的个数K需要事先指定
2.由于kmeans算法可能停留在局部最优而不收敛于全局最优,在使用K-Means算法进行聚类之前,需要初始化K个聚类中心
解决方法
1.选择尽可能远离的点
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# Generating 100 data points and divide them into 2 groups
X= -2 * np.random.rand(100,2)
X1 = 1 + 2 * np.random.rand(50,2)
X[50:100, :] = X1
plt.scatter(X[ : , 0], X[ :, 1], s = 50, c = 'b')
plt.show()
from sklearn.cluster import KMeans
Kmean = KMeans(n_clusters=2)
Kmean.fit(X)
# Finding the center of the clusters
print(Kmean.cluster_centers_)
plt.scatter(X[ : , 0], X[ : , 1], s =50, c='b')
plt.scatter(-0.94665068, -0.97138368, s=200, c='g', marker='s')
plt.scatter(2.01559419, 2.02597093, s=200, c='r', marker='s')
plt.show()
# Getting the labels
print(Kmean.labels_)
# Predicting the cluster of a data point
sample_test=np.array([-3.0,-3.0])
second_test=sample_test.reshape(1, -1)
print(Kmean.predict(second_test))