Arthur Samuel提出的机器学习(Machine learning)的定义为:机器学习是一个学习领域,并在没有明确训练的情况下,教给计算机学习的能力。Tom Mitchell提出的机器学习的定义为:计算机程序从经验E中学习任务T,并用度量P来衡量性能。条件是它由P定义的关于T的性能随着经验E而提高。机器学习主要有两类:监督学习和非监督学习。监督学习(Supervised learning)就是我们教计算机如何做事情,而非监督学习(Unsupervised learning)是我们让计算机自己学习。
监督学习
监督学习是指我们给算法一个数据集,并且给定正确答案,算法的目的就是预测给出更多的正确答案。
- 回归问题:回归是指我们的目标是预测一个连续的输出值。
例如:给定一个房屋数据集,即每个房子卖出的实际价格,对想要卖的其它房子给出估价。 - 分类问题:目的是预测离散的输出值。
例如:根据乳腺瘤的尺寸预测乳腺癌是恶性的还是良性的。可选取多个特征,也可分为多类(两类及以上)
非监督学习
在非监督学习中没有属性和标签这一概念,只有一个数据集。
- 聚类算法:
应用:组织大型计算机集群、社交网络分析、客户信息数据集分类、天文数据分析。
k-means算法
k-means算法是一种经典聚类算法:基本思想是以空间中K个点为中心,进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
算法的基本步骤:
1、从n个数据对象任意选择k个对象作为初始聚类中心;并设定最大迭代次数
2、计算每个对象与k个中心点的距离,并根据最小距离对相应对象进行划分,即把对象划分到与他们最近的中心所代表的类别中去。
3、对于每一个中心点,遍历他们所包含的对象,计算这些对象所有维度的和的均值,获得新的中心点
4、如果聚类中心与上次迭代之前相比,有所改变,或者算法迭代次数小于给定的最大迭代次数,则继续执行第二、三两步,否则,程序结束返回聚类结果
代码实现如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84import numpy as np
import matplotlib.pyplot as plt
#随机生成聚类中心
def initCenters(dataSet,k):
numSamples, dim = dataSet.shape #shape函数返回数组维度的元组,numSamples行dim列
centers = np.zeros((k,dim)) #numpy.zeros函数生成指定维数的全零数组
for i in range(k):
index = int(np.random.uniform(0,numSamples)) #random get k centers numpy.random.uniform函数从一个均匀分布[low,high)中随机采样
centers[i, :] = dataSet[index, :] #生成随机选取的聚类中心
print(centers)
return centers
#计算一个数据点到所有聚类中心的距离
def Dist2Centers(sample,centers):
k = centers.shape[0] #shape[0]表示行数
dis2cents = np.zeros(k) #初始化存放一个点到k个聚类中心的距离的1行k列数组
for i in range(k):
dis2cents[i] = np.sqrt(np.sum(np.power(sample - centers[i,:],2))) #距离=sqrt(x^2+y^2)
return dis2cents
def kmeans(dataSet,k,iterNum):
numSamples = dataSet.shape[0]
iterCount = 0
#clusterAssignment stores which cluster this sample belongs to,
clusterAssignment = np.zeros(numSamples)
clusterchanged = True
##step 1 : initialize centers
centers = initCenters(dataSet, k) #初始化聚类中心
while clusterchanged and iterCount < iterNum:
clusterchanged = False
iterCount = iterCount + 1
## for each sample
for i in range(numSamples):
dis2cent = Dist2Centers(dataSet[i,:],centers)
minIndex = np.argmin(dis2cent) #返回数组dis2cent中最小值的索引
## step3: update its belonged cluster(更新点的所属集群)
if clusterAssignment[i] != minIndex:
clusterChanged = True
clusterAssignment[i] = minIndex
#求平均值计算新的聚类中心
for j in range(k):
pointsInCluster = dataSet[np.nonzero(clusterAssignment[:] == j)[0]]
centers[j, :] = np.mean(pointsInCluster, axis = 0) #mean(array, axis = 0)函数表示对各列求平均值
print ('congratulations, Cluster Achieved!')
return centers, clusterAssignment
def showCluster(dataSet, k, centers, clusterAssignment):
numSamples, dim = dataSet.shape
mark = ['or', 'ob', 'og', 'om']
# draw all samples
for i in range(numSamples):
markIndex = int(clusterAssignment[i])
plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])
mark = ['Dr', 'Db', 'Dg', 'Dm']
# draw the centroids
for i in range(k):
plt.plot(centers[i, 0], centers[i, 1], mark[i], markersize = 10)
plt.show()
def main():
##step1: load dataSet(加载数据集)
print ("step 1: loading data...")
dataSet = []
dataSetFile = open(r'H:\Python自学编写程序\北理工\testSet.txt')
for line in dataSetFile:
lineArr = line.strip().split('\t') #去除两边空格,以制表符分割
dataSet.append([float(lineArr[0]),float(lineArr[1])]) #每个点的[x,y]坐标以列表的形式存入dataSet
#step 2: clustering...(集群)
print ("step 2: clustering...")
dataSet = np.mat(dataSet) #mat函数可以将目标数据的类型转换为矩阵(matrix)
k = 4 #聚类个数为4
centers_result, clusterAssignment_result = kmeans(dataSet, k, 100) #最大迭代次数100
#step 3: show the result
print ("step3: showing the result...")
showCluster(dataSet, k, centers_result, clusterAssignment_result)
main()