Python kmean

# -*- coding: utf-8 -*-
from sklearn.cluster import KMeans
from sklearn.externals import joblib
import numpy

feature =numpy.random.rand(40,20)

#调用kmeans类
clf = KMeans(n_clusters=9)
s = clf.fit(feature)
print s

#9个中心
print clf.cluster_centers_

#每个样本所属的簇
print clf.labels_

#用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
print clf.inertia_

#进行预测
print clf.predict(feature)

#保存模型
joblib.dump(clf , 'c:/km.pkl')

#载入保存的模型
clf = joblib.load('c:/km.pkl')

'''
#用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
for i in range(5,30,1):
    clf = KMeans(n_clusters=i)
    s = clf.fit(feature)
    print i , clf.inertia_
'''

### Python中K-Means聚类算法的实现示例 #### K-Means算法简介 K-Means是一种基于划分的无监督学习算法,其目标是将数据集中的样本分成 \( K \) 个簇(clusters),使每个簇内的样本尽可能相似,而不同簇之间的差异最大化。具体来说,K-Means通过不断调整簇中心的位置以及重新分配样本到最近的簇中心来优化目标函数——即最小化所有样本其所属簇中心的距离平方和。 以下是K-Means的主要步骤[^3]: 1. 随机初始化 \( K \) 个簇中心。 2. 将每个样本分配到距离最近的簇中心所在的簇。 3. 更新每个簇的中心位置为该簇内所有样本坐标的均值。 4. 如果簇中心发生变化或者未达到收敛条件,则返回第2步继续迭代;否则停止。 #### 使用Python实现K-Means聚类 在Python中可以利用`scikit-learn`库快速实现K-Means聚类功能。下面是一个完整的代码示例: ```python import pandas as pd from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt # 假设我们有一个DataFrame `df` 包含特征列 ['Age', 'Annual Income (k$)', 'Spending Score (1-100)'] data = { 'Age': [19, 21, 20, 23, 31, 41], 'Annual Income (k$)': [15, 18, 16, 24, 60, 77], 'Spending Score (1-100)': [39, 81, 60, 51, 55, 19] } df = pd.DataFrame(data) # 数据标准化处理 scaler = StandardScaler() scaled_features = scaler.fit_transform(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']]) # 设置K值并运行K-Means算法 kmeans = KMeans(n_clusters=3, random_state=0) df['Cluster'] = kmeans.fit_predict(scaled_features) # 输出聚类结果 print("聚类标签:", df['Cluster']) # 可视化聚类结果(二维投影) plt.scatter(df['Annual Income (k$)'], df['Spending Score (1-100)'], c=df['Cluster'], cmap='viridis') centers = kmeans.cluster_centers_ plt.scatter(centers[:, 1], centers[:, 2], c='red', s=200, alpha=0.75) plt.xlabel('Annual Income (k$)') plt.ylabel('Spending Score (1-100)') plt.title('K-Means Clustering Result') plt.show() # 计算轮廓系数评价模型性能 silhouette_avg = silhouette_score(scaled_features, df['Cluster']) print(f'平均轮廓系数(Silhouette Score): {silhouette_avg}') ``` 上述代码实现了以下操作: 1. 创建了一个简单的客户行为数据集,并将其存储在一个Pandas DataFrame对象中。 2. 对原始数据进行了标准化预处理以便更好地适应K-Means的要求[^1]。 3. 应用了K-Means算法对数据进行分类,并将预测得到的类别标签附加到了原数据框上。 4. 绘制了散点图展示两维空间下的聚类分布情况。 5. 利用Silhouette Score指标衡量当前聚类的质量水平[^2]。 #### 改进版:X-means自动选择最佳K值 为了克服传统K-Means需要手动指定\( K \) 的局限性,可以通过引入X-means方法来自动生成最优数目范围内的多个候选解,并从中挑选具有最高BIC得分的那个方案作为最终答案[^4]。 ```python class XMeans: def __init__(self, min_clusters=1, max_clusters=50): self.min_clusters = min_clusters self.max_clusters = max_clusters def fit(self, data): best_bic = float('-inf') optimal_k = None for k in range(self.min_clusters, self.max_clusters + 1): km = KMeans(n_clusters=k).fit(data) bic = compute_bic(km, data) if bic > best_bic: best_bic = bic optimal_k = k return KMeans(n_clusters=optimal_k).fit(data), optimal_k def compute_bic(kmeans_model, data): """计算贝叶斯信息标准""" n_samples, _ = data.shape centroids = kmeans_model.cluster_centers_ labels = kmeans_model.labels_ variance_within_cluster = sum([np.linalg.norm(data[labels == i] - centroid)**2 for i, centroid in enumerate(centroids)]) / n_samples log_likelihood = (-n_samples * np.log(variance_within_cluster)) \ - ((len(centroids)*_)/2*np.log(np.pi*variance_within_cluster)) num_params = len(centroids.flatten()) + 1 bic_value = log_likelihood - .5*num_params*np.log(n_samples) return bic_value ``` 此部分定义了一个名为`XMeans`的新类用于封装整个流程逻辑,同时还提供辅助工具函数帮助完成实际运算任务。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值