前言:有三维聚类图,我只是一个代码的搬运工。。。
机器学习专栏:机器学习专栏
k-均值算法是一种无监督学习,是一种“基于原型的聚类”(prototype-based clustering)方法,给定的数据是不含标签的 D = { x ( 1 ) , x ( 2 ) , . . . , x ( i ) } D=\{{x^{(1)},x^{(2)},...,x^{(i)}}\} D={x(1),x(2),...,x(i)},目标是找出数据的模式特征进行分类。如社交网络分析,通过用户特征进行簇划分,分出不同群体。
(图源网络,侵删)
给定数据集 D = { x ( 1 ) , x ( 2 ) , . . . , x ( i ) } D=\{{x^{(1)},x^{(2)},...,x^{(i)}}\} D={x(1),x(2),...,x(i)},k-均值聚类算法的代价函数(基于欧式距离的平方误差)为:
J = m 1 ∑ i = 1 m ∣ ∣ x ( i ) − u c ( i ) ∣ ∣ 2 J=\frac{m}{1}\sum_{i=1}^{m}||x^{(i)}-u_{c^{(i)}}||^2 J=1mi=1∑m∣∣x(i)−uc(i)∣∣2
其中, c ( i ) c^{(i)} c(i)是训练样例 x ( i ) x^{(i)} x(i)分配的聚类序号; u c ( i ) u_{c^{(i)}} uc(i)是 x ( i ) x^{(i)} x(i)所属聚类的中心点 。k-均值算法的代价函数函数的物理意义就是,训练样例到其所属的聚类中心点的距离的平均值。
k-均值算法主要包括:根据聚类中心分配样本类别——>更新聚类中心
1、在实际应用的过程中,聚类结果会和我们初始化的聚类中心相关,因为代价函数可能会收敛在一个局部最优解上,而不是全局最优解。我们的解决方法是多次初始化,然后选取代价函数最小的。
2、如果没有特别的业务要求,聚类个数如何选取?我们可以把聚类个数作为横坐标,代价函数作为纵坐标,找出拐点。
推荐一篇博文: 聚类效果评价
主函数KMeans
sklearn.cluster.KMeans(n_clusters=8,
init='k-means++',
n_init=10,
max_iter=300,
tol=0.0001,
precompute_distances='auto',
verbose=0,
random_state=None,
copy_x=True,
n_jobs=1,
algorithm='auto'
)
参数解释:
代码:
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 20 18:52:21 2019
@author: 1
"""
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
df=pd.read_csv('D:\\workspace\\python\machine learning\\data\\iris.csv',sep=',')
data=df.iloc[:,0:3]
kmeans=KMeans(n_clusters=3) #n_clusters:number of cluster
kmeans.fit(data)
labels=kmeans.labels_#聚类标签
centres=kmeans.cluster_centers_#聚类中心
#画三维聚类结果图
markers=['o','^','*']
colors=['r','b','y']
data['labels']=labels
ax = plt.subplot(111, projection='3d') # 创建一个三维的绘图工程
data_new,X,Y,Z=[[]]*3,[[]]*3,[[]]*3,[[]]*3
for i in range(3):
data_new[i]=data.loc[data['labels']==i]
X[i],Y[i],Z[i]=data_new[i].iloc[:,0],data_new[i].iloc[:,1],data_new[i].iloc[:,2]
ax.scatter(X[i],Y[i],Z[i],marker=markers[i],c=colors[i])