😆😆😆感谢大家的观看😆😆😆
💥聚类算法是一种无监督学习方法,用于将数据集中的对象划分为若干个簇,使得同一个簇内的对象之间具有较高的相似性,而不同簇的对象之间具有较大的差异性。
聚类算法的应用场景:
聚类算法因其能够在无监督的环境中发现数据的内在结构和模式,而在各个领域都有广泛的应用。选择合适的聚类算法和参数对于解决特定问题至关重要。这类方法通常需要预先指定簇的数量,并通过迭代优化来找到最佳的数据划分。典型的划分方法包括K-means算法、K-medoids算法等。这些算法通过最小化簇内对象与簇中心(或代表对象)的距离之和来实现数据的划分。
层次聚类不需要预先指定簇的数量,而是通过逐层合并或分裂数据对象来构建一个层次结构的聚类树形图。代表性的算法有AGNES(自底向上的聚合算法)和DIANA(自顶向下的分裂算法)。
聚类的定义
sklearn.cluster.KMeans(n_clusters=8) n_clusters:开始的聚类中心数量
estimator.fit(x)
estimator.predict(x)
estimator.fit_predict(x)# 相当于先调用fit(x),然后再调用predict(x)
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 创建数据集
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
cluster_std=[0.4, 0.2, 0.2, 0.2],
random_state=9)
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()
y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
# 用轮廓系数评估的聚类分数
print(silhouette_score(X, y_pred))
💥误差平方和(SSE)
( SSE = \sum_{i=1}^{k}\sum_{p in C_{i}} \left| p-m_{i}\right|^{2} )。 其中,( C_{i} ) 是第 ( i ) 个簇,( p ) 是 ( C_{i} ) 中的样本点,( m_{i} ) 是 ( C_{i} ) 的质心(即 ( C_{i} ) 中所有样本的均值)。SSE 计算的是所有样本点到其所属簇的质心的距离平方和,这个指标反映了簇内样本点的紧密程度。在聚类分析中,SSE 的值越小,表示簇内样本点越紧密,聚类效果通常被认为越好。
💥肘部法(Elbow method)
对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和; 平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。 当误差平方和(SSE)的下降率突然变缓时,这个点就是最佳的K值。
💥轮廓系数法(Silhouette Coefficient)
对于簇中的每个点,首先计算该点到同簇其他点的平均距离(称为a),然后计算该点到最近簇(非本簇)中所有点的平均距离(称为b)。轮廓系数s(i)就是(b - a) / max(a, b)。 轮廓系数的值介于[-1, 1]之间。当轮廓系数接近1时,表示该点远离相邻簇,说明聚类效果较好;当轮廓系数接近-1时,表示该点可能被错误地归类到了相邻的簇中,聚类效果较差;如果轮廓系数接近0,则说明该点位于两个相邻簇的交界处,聚类效果不明显。
💥用于训练的数据集特征对模型的性能有着极其重要的作用。如果训练数据中包含一些不重要的特征,可能导致模型的泛化性能不佳。某些特征的取值较为接近,其包含的信息较少
降维 是指在某些限定条件下,降低特征个数
低方差过滤法
相关系数法
PCA(主成分分析)降维法
低方差过滤法
transformer = VarianceThreshold(threshold=0.1)
data = transformer.fit_transform(data)
print(data.shape)
删除方差低于 threshold 的特征将被删除,默认值是保留所有非零方差特征。
主成分分析法
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
if __name__ == '__main__':
x, y = load_iris(return_X_y=True)
print(x[:5])
# 保留指定比例的信息
transformer = PCA(n_components=0.95)
x_pca = transformer.fit_transform(x)
print(x_pca[:5])
# 保留指定数量特征
transformer = PCA(n_components=2)
x_pca = transformer.fit_transform(x)
print(x_pca[:5])
import pandas as pd
dataset = pd.read_csv('data.csv')
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 5, init = 'k-means++', random_state = 42)
y_kmeans = kmeans.fit_predict(X)
# 聚类数为5,init='k-means++'表示使用k-means++算法进行初始化
# random_state=42用于设置随机种子以确保结果的可重复性
# K-means算法最开始随机选取数据集中K个点作为聚类中心
'''K-means++假设已经选取了n个初始聚类中心,则在选取n+1个聚类中心时距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心。'''
import matplotlib.pyplot as plt
wcss = []
for i in range(1, 11): #循环使用不同k测试结果
kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
kmeans.fit(X)
wcss.append(kmeans.inertia_) #inertia簇内误差平方和
plt.plot(range(1, 11), wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
K-Means在算法稳定性、效率和准确率(相对于真实标签的判别)上表现非常好,并且在应对大量数据时依然如此。它的算法时间复杂度上界为O(n * k * t),其中n是样本量、k是划分的聚类数、t是迭代次数。
选择K值时如果数据分布较为均匀,那么可以选择较小的k值;如果数据分布较为复杂,那么可能需要选择较大的k值。数据量也是影响k值选择的一个重要因素。数据量越大,通常可以容忍更大的k值。肘部法则是一种常用的选择k值的方法。通过计算不同k值下的簇内误差平方和(SSE),并绘制成图,可以找到曲线的“肘部”,即最佳的k值。
在实际项目中,可以通过交叉验证等方法来验证不同k值下模型的性能,从而选择合适的k值。