無(wú)監(jiān)督學(xué)習(xí)(unsupervised learning)
在無(wú)監(jiān)督學(xué)習(xí)中肮街,訓(xùn)練樣本的標(biāo)記信息是未知的,目標(biāo)是通過(guò)對(duì)無(wú)標(biāo)記訓(xùn)練樣本的學(xué)習(xí)來(lái)揭示數(shù)據(jù)的內(nèi)在性質(zhì)及規(guī)律速勇,為進(jìn)一步的數(shù)據(jù)分析提供基礎(chǔ)截珍。
聚類(clustering)
聚類算法的目標(biāo)是將數(shù)據(jù)集合分成若干簇,使得同一簇內(nèi)的數(shù)據(jù)點(diǎn)相似度盡可能大吞瞪,而不同簇間的數(shù)據(jù)點(diǎn)相似度盡可能小馁启。
聚類要求
k-均值算法(k-means)---基于原型的聚類
K-Means算法是一種較典型的逐點(diǎn)修改迭代的動(dòng)態(tài)聚類算法
1.首先從d維空間中選擇k個(gè)數(shù)據(jù)點(diǎn)作為初始聚類的均值(中心)/簇
2.計(jì)算每個(gè)數(shù)據(jù)點(diǎn)到這些聚類中心的距離,然后把各個(gè)數(shù)據(jù)點(diǎn)分配給離它最近的那個(gè)聚類
3.如果所有數(shù)據(jù)點(diǎn)都不再被重新分配芍秆,難么就停止并保持現(xiàn)有聚類
4.如果仍有數(shù)據(jù)點(diǎn)被重新分配惯疙,則重新計(jì)算均值,并返回到第2步
由于每次都要計(jì)算所有的樣本與每一個(gè)質(zhì)心之間的距離妖啥,因此在大規(guī)模的數(shù)據(jù)集上霉颠,K-Means算法的收斂速度比較慢。
最優(yōu)的聚類結(jié)果需要符合以 下兩個(gè)假設(shè)
1.“簇中心點(diǎn)”(cluster center)是屬于該簇的所有數(shù)據(jù)點(diǎn)坐標(biāo)的算術(shù)平均值荆虱。
- 一個(gè)簇的每個(gè)點(diǎn)到該簇中心點(diǎn)的距離蒿偎,比到其他簇中心點(diǎn)的距離短。
k=2 N=14
k=3
一種用于度量聚類效果的指標(biāo)是SSE(SumofSquaredError,誤差平方和)怀读,SSE值越小表示數(shù)據(jù)點(diǎn)越接近它們的質(zhì)心诉位,聚類效果也越好。因此建議對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化以使其平均值為零愿吹,標(biāo)準(zhǔn)差為1不从。
K-Means算法的局限性
1.聚類中心的個(gè)數(shù)K需要事先指定
2.由于kmeans算法可能停留在局部最優(yōu)而不收斂于全局最優(yōu),在使用K-Means算法進(jìn)行聚類之前犁跪,需要初始化K個(gè)聚類中心
解決方法
1.選擇盡可能遠(yuǎn)離的點(diǎn)
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))