社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习实战(17)—— K-Means 算法代码实现

人工智能爱好者社区 • 3 年前 • 478 次点击  

👇点击关注公众号👇

第一时间获取人工智能干货内容


本篇文章带大家实现K-Means算法。


首先,导入鸢尾花数据集:


from sklearn.datasets import load_iris
iris = load_iris()


导入K-Means模型并进行聚类操作:


from sklearn.cluster import KMeans
#?KMeans
kmeans = KMeans(n_clusters = 3, init = 'k-means++', random_state = 123)#k=3 
#init = 'k-means++'  一种可以避免选择较差起始点的方法
y_kmeans = kmeans.fit_predict(iris.data)#产生结果


其中:

n_clusters = 3 代表聚类为3类

init = 'k-means++' 代表一种可以避免选择较差起始点的方法


查看聚类结果:


y_kmeans


一样的数字代表聚为一类。


将3种鸢尾花的聚类结果可视化(这里选择花瓣长度和宽度作为特征可视化):


import matplotlib.pyplot as plt
%matplotlib inline
#将聚类结果显示
plt.scatter(iris.data[y_kmeans == 02], iris.data[y_kmeans == 03], s = 100, c = 'red', label = 'Cluster 1')
#[y_kmeans == 0, 2], 花瓣长度在第3的栏位,所以是2,花瓣宽度是第4栏位,所以是3,s = 100是点的大小
plt.scatter(iris.data[y_kmeans == 12], iris.data[y_kmeans == 13], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(iris.data[y_kmeans == 22], iris.data[y_kmeans == 23], s = 100, c = 'green', label = 'Cluster 3')

plt.title('Clusters of Iris')
plt.xlabel('Petal.Length')
plt.ylabel('Petal.Width')
plt.legend()
plt.show()



输出4个特征聚类结果的中心点:


kmeans.cluster_centers_ #下面是  三种的   花萼长的中心点,花萼宽的中心点,花瓣长的中心点,花瓣宽的中心点



将聚类中心点打印在图中:


plt.scatter(iris.data[y_kmeans == 02], iris.data[y_kmeans == 03], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(iris.data[y_kmeans == 12], iris.data[y_kmeans == 13], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(iris.data[y_kmeans == 22], iris.data[y_kmeans == 23], s = 100, c = 'green', label = 'Cluster 3')

#绘制中心点
plt.scatter(kmeans.cluster_centers_[:, 2], kmeans.cluster_centers_[:, 3], s = 100, c = 'black', label = 'Centroids')#花瓣长和花瓣宽
plt.title('Clusters of Iris')
plt.xlabel('Petal.Length')
plt.ylabel('Petal.Width')
plt.legend()
plt.show()


接下来看个客户属性聚类的案例


读取并查看数据





    
import pandas as pd
#dataset = pandas.read_csv(r'D:\机器学习第二天\customers.csv')
f = open(r'D:\机器学习数据第二天\customers.csv')
dataset = pd.read_csv(f)
dataset.head()



从上面图中发现,包含顾客ID、性别、年龄、年收入、消费能力等5个特征。


考虑将年收入与消费能力作为聚类特征依据:



X = dataset.iloc[:, [34]].values#全部行,第四第五列  Annual Income (k$) 和 Spending Score (1-100)
#X
#考虑最后两栏作为分群依据


开始聚类:


from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 5, init = 'k-means++', random_state = 42)#k=5 
y_kmeans = kmeans.fit_predict(X)
#y_kmeans


输出聚类结果可视化:


#标记 中心
plt.scatter(X[y_kmeans == 00], X[y_kmeans == 01], s = 100, c = 'red', label = 'Standard')
plt.scatter(X[y_kmeans == 10], X[y_kmeans == 11], s = 100, c = 'blue', label = 'Traditional')
plt.scatter(X[y_kmeans == 20], X[y_kmeans == 21], s = 100, c = 'green', label = 'Normal')
plt.scatter(X[y_kmeans == 30], X[y_kmeans == 31], s = 100 , c = 'cyan', label = 'Youth')
plt.scatter(X[y_kmeans == 40], X[y_kmeans == 41], s = 100, c = 'magenta', label = 'TA')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'black', label = 'Centroids')
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()



如果你仔细观察,发现之前的聚类个数选择为5个,聚类个数可以通过肘方法实现选择。


#肘方法
import matplotlib.pyplot as plt
wcss = []
for i in range(111): #循环使用不同k测试结果
    kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)
plt.plot(range(111), wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()


通过观察以上肘方法得到的图,选择5个聚类类别比较合适!


这就是K-Means聚类的案例实现了,你学会了么?


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/116967
 
478 次点击