[关闭]
@Metralix 2017-09-17T04:59:00.000000Z 字数 3838 阅读 1558

关于KNN和K-means算法的学习报告


KNNK-means


KNN:

KNN 算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性



伪代码:

计算测试数据与各个训练数据之间的距离;
按照距离的递增关系进行排序;
选取距离最小的K个点;
确定前K个点所在类别的出现频率;
返回前K个点中出现频率最高的类别作为测试数据的预测分类

训练参数:

dataset16.mat\fourclass



实现代码(Python):

KNN_Algorithm:

  1. #coding=utf-8
  2. __anthor__='Haoyang Li'
  3. '''KNN算法的实现,时间复杂度O(n)
  4. 样本数据集采用datesaet16.mat中的fourclass'''
  5. import numpy as np
  6. import matplotlib.pyplot as plt
  7. import scipy.io as sio
  8. import math
  9. import operator
  10. d = sio.loadmat('dataset16.mat')
  11. data = (d['fourclass'])
  12. x, y = data[:, 1], data[:, 2] # 样本的两个特征x
  13. xy_set = np.array([np.reshape(x,len(x)),np.reshape(y,len(y))]).transpose()
  14. label = data[:, 0] # 对应的标签y
  15. def Knn_Algorithm(input=([0,0.5]),k=3):
  16. # 计算输入点据样本中各个点的距离
  17. data_num = data.shape[0]
  18. diff_xy = np.tile(input,(data_num,1))-xy_set
  19. diff_xy_2 = diff_xy ** 2
  20. dist_2 = diff_xy_2[:, 0] + diff_xy_2[:, 1]
  21. #另一种操作:dist_2 = np.sum(cha_xy_2,axis=1)
  22. distance = dist_2 ** 0.5
  23. #对距离进行排序
  24. sorted_index = np.argsort(distance)
  25. #对所属类别进行统
  26. cluster_cnt = {}
  27. for i in range(k):
  28. to_label = label[sorted_index[i]]
  29. if 'to_label' in cluster_cnt.keys():
  30. cluster_cnt[to_label] += 1
  31. else:
  32. cluster_cnt[to_label] = 1
  33. # 更好的操作:cluster_cnt[to_label] = cluster_cnt.get(to_label,0)+1
  34. #遍历一次得出结果
  35. max = 0
  36. for key,value in cluster_cnt.items():
  37. if(value) > max:
  38. result = key
  39. return result
  40. #print (Knn_Algorithm())

测试代码:

  1. #coding=utf-8
  2. import sys
  3. import numpy as np
  4. sys.path.append(r"C:\Users\54164\PycharmProjects\K-Algorithm")
  5. import KNN_Algorithm
  6. input = np.array([0.34,0.32])
  7. k=3
  8. output = KNN_Algorithm.Knn_Algorithm(input,k)
  9. print("测试数据为:",input,"分类结果为:",output)

实验结果:



K-means:

K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。



算法步骤

1.Initialize cluster centroids(初始化聚类中心)


2.repeat till convergence(重复下面步骤直到收敛)
i)

ii)

伪代码:

随机选择k个点作为初始聚类中心;
当任意一个点的簇分配结果发生改变时:
  对数据集中的每一个数据点:
    对每一个质心:
      计算质心与数据点的距离
    将数据点分配到距离最近的簇
  对每一个簇,计算簇中所有点的均值,并将均值作为质心

训练参数:

dateset16.mat\kmeans_test



实现代码(Python):

  1. #coding=utf-8
  2. __anthor__='Haoyang Li'
  3. '''K-means算法的实现
  4. 样本数据集采用datesaet16.mat中的svmguide1'''
  5. import numpy as np
  6. import time
  7. import matplotlib.pyplot as plt
  8. import scipy.io as sio
  9. import math
  10. d = sio.loadmat('dataset16.mat')
  11. data = (d['kmeans_test'])
  12. #x, y = data[:, 0], data[:, 1]
  13. #计算欧式距离(Euclidean distance)
  14. def eucl_distance(vec_1,vec_2):
  15. return math.sqrt(np.sum(np.power(vec_1-vec_2,2)))
  16. #s随机初始化聚类中心(inicialize centroids)
  17. def init_centroids(data_set,k):
  18. data_num,dimension = data_set.shape
  19. centroids = np.zeros((k,dimension))
  20. for i in range(k):
  21. index = int(np.random.uniform(0,data_num))
  22. centroids[i,:] = data_set[index,:]
  23. return centroids
  24. def k_means(data_set,k):
  25. data_num = data_set.shape[0]
  26. clus_assiment = np.zeros((data_num, 1))
  27. clus_adjusted = True
  28. #初始化聚类
  29. centroids = init_centroids(data_set,k)
  30. while clus_adjusted:
  31. clus_adjusted=False
  32. #对于每个样本
  33. for i in range(data_num):
  34. min_dist = 1000000
  35. min_index = 0
  36. #对于每个聚类中心
  37. for j in range(k):
  38. #找到最近的聚类
  39. distance = eucl_distance(centroids[j,:],data_set[i,:])
  40. if distance < min_dist:
  41. min_dist = distance
  42. min_index = j
  43. #更新点的聚类
  44. if clus_assiment[i,0] != min_index:
  45. clus_adjusted = True
  46. clus_assiment[i] = min_index
  47. #更新聚类
  48. for j in range(k):
  49. points = data_set[np.nonzero(clus_assiment[:, 0] == j)[0]]
  50. centroids[j, :] = np.mean(points, axis=0)
  51. print('K-means聚类完成~')
  52. #绘图
  53. colors = ['b', 'g', 'r', 'k', 'c', 'm', 'y', '#e24fff', '#524C90', '#845868']
  54. for i in range(data_num):
  55. mark_index = int(clus_assiment[i,0])
  56. plt.scatter(data_set[i,0],data[i,1],color=colors[mark_index])
  57. plt.show()

测试代码:

  1. #coding=utf-8
  2. import sys
  3. import scipy.io as sio
  4. import numpy as np
  5. sys.path.append(r"C:\Users\54164\PycharmProjects\K-Algorithm")
  6. import K_means
  7. d = sio.loadmat('dataset16.mat')
  8. data = (d['kmeans_test'])
  9. k=4
  10. K_means.k_means(data,k)

实验结果:



总结:

KNN K-means
1.KNN是分类算法
2.监督学习
3.喂给它的数据集是带label的数据,已经是完全正确的数据
1.K-means是聚类算法
2.无监督学习
没有明显的前期训练过程,属于memory-based learning 有明显的前期训练过程
K的含义:来了一个样本x,要给它分类,即求出它的y,就从数据集中,在x附近找离它最近的K个数据点,这K个数据点,类别c占的个数最多,就把x的label设为c K的含义:K是人工固定好的数字,假设数据集合可以分为K个簇,由于是依靠人工定好,需要一点先验知识










The End










添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注