基于 K-Means 对 IRIS 数据集分类

基于sklearn 对 IRIS 数据集分类

关于聚类

聚类(Clustering)是一种无监督学习(unsupervised learning),简单地说就是把相似的对象归到同一簇中。簇内的对象越相似,聚类的效果越好。

关于 K-Means

K-Means算法是最为经典的基于划分的聚簇方法,是十大经典数据挖掘算法之一。简单的说K-Means就是在没有任何监督信号的情况下将数据分为K份的一种方法。聚类算法就是无监督学习中最常见的一种,给定一组数据,需要聚类算法去挖掘数据中的隐含信息。聚类算法的应用很广:顾客行为聚类,google新闻聚类等。

具体的算法步骤如下:

  1. 随机选择K个中心点
  2. 把每个数据点分配到离它最近的中心点;
  3. 重新计算每类中的点到该类中心点距离的平均值
  4. 分配每个数据到它最近的中心点;
  5. 重复步骤3和4,直到所有的观测值不再被分配或是达到最大的迭代次数(R把10次作为默认迭代次数)。

sklearn 实现

from sklearn import datasets
from sklearn.cluster import KMeans
import numpy as np

def mode(a):
	```求众数子函数```
    counts = np.bincount(a)  
    return np.argmax(counts)

def calc_acc(y_p, y):
	```计算准确率子函数```
    return sum(y_p==y)/y.shape[0]


if __name__ == '__main__':
    
    iris = datasets.load_iris()

    x = iris.get('data')
    y = iris.get('target')

    # 随机划分训练集和测试集
    num = x.shape[0] # 样本总数
    ratio = 7/3 # 划分比例,训练集数目:测试集数目
    num_test = int(num/(1+ratio)) # 测试集样本数目
    num_train = num -  num_test # 训练集样本数目
    index = np.arange(num) # 产生样本标号
    np.random.shuffle(index) # 洗牌
    x_test = x[index[:num_test],:] # 取出洗牌后前 num_test 作为测试集
    y_test = y[index[:num_test]]
    x_train = x[index[num_test:],:] # 剩余作为训练集
    y_train = y[index[num_test:]]

    kmeans = KMeans(n_clusters=3)
    kmeans.fit(x_train)

    centers = kmeans.cluster_centers_
    for i in range(3):
        index = y_train == i
        p = kmeans.predict(x_train[index,:])
        pp = mode(p) # 求实际类别为 i 所对应的类别标号 pp
        kmeans.cluster_centers_[i] = centers[pp] # 相应的调整类别标号,以正确预测

    y_test_pre = kmeans.predict(x_test)
    print("y_test_pre:")
    print(y_test_pre)
    print("y_test:")
    print(y_test)

    # 计算分类准确率
    acc = calc_acc(y_test_pre, y_test)
    print('the accuracy is', acc) # 显示预测准确率

运行结果:

猜你喜欢

转载自blog.csdn.net/healingwounds/article/details/85929709