本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订 。
KNN实战(一) - 怪人_杨 阅读原文»
这两天一直忙于比赛还有各种培训什么的,今天也算是有时间看看书,调调程序了,我的小心脏辣个兴奋啊。言归正传,之前,对KNN进行了一个简单的验证,今天我们使用KNN改进约会网站的效果,个人理解,这个问题也可以转化为其它的比如各个网站迎合客户的喜好所作出的推荐之类的,当然,今天的这个例子功能也实在有限。
在这里根据一个人收集的约会数据,根据主要的样本特征以及得到的分类,对一些未知类别的数据进行分类,大致就是这样。
我使用的是python 3.4.3,首先建立一个文件,例如date.py,具体的代码如下:
#coding:utf-8
from numpy import *
import operator
from collections import Counter
import matplotlib
import matplotlib.pyplot as plt
###导入特征数据
def file2matrix(filename):
fr = open(filename)
contain = fr.readlines()###读取文件的所有内容
count = len(contain)
returnMat = zeros((count,3))
classLabelVector = []
index = 0
for line in contain:
line = line.strip() ###截取所有的回车字符
listFromLine = line.split('\t')
returnMat = listFromLine[0:3]###选取前三个元素,存储在特征矩阵中
classLabelVector.append(listFromLine[-1])###将列表的最后一列存储到向量classLabelVector中
index += 1
##将列表的最后一列由字符串转化为数字,便于以后的计算
dictClassLabel = Counter(classLabelVector)
classLabel = []
kind = list(dictClassLabel)
for item in classLabelVector:
if item == kind[0]:
item = 1
elif item == kind[1]:
item = 2
else:
item = 3
classLabel.append(item)
return returnMat,classLabel#####将文本中的数据导入到列表
##绘图(可以直观的表示出各特征对分类结果的影响程度)
datingDataMat,datingLabels = file2matrix('D:\python\Mechine learing in Action\KNN\datingTestSet.txt')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()
## 归一化数据,保证特征等权重
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))##建立与dataSet结构一样的矩阵
m = dataSet.shape[0]
for i in range(1,m):
normDataSet = (dataSet - minVals) / ranges
return normDataSet,ranges,minVals
##KNN算法
def classify(input,dataSet,label,k):
dataSize = dataSet.shape[0]
####计算欧式距离
diff = tile(input,(dataSize,1)) - dataSet
sqdiff = diff ** 2
squareDist = sum(sqdiff,axis = 1)###行向量分别相加,从而得到新的一个行向量
dist = squareDist ** 0.5
##对距离进行排序
sortedDistIndex = argsort(dist)##argsort()根据元素的值从大到小对元素进行排序,返回下标
classCount={}
for i in range(k):
voteLabel = label[sortedDistIndex[i]]
###对选取的K个样本所属的类别个数进行统计
classCount[voteLabel] = classCount.get(voteLabel,0) + 1
###选取出现的类别次数最多的类别
maxCount = 0
for key,value in classCount.items():
if value > maxCount:
maxCount = value
classes = key
return classes
##测试(选取10%测试)
def datingTest():
rate = 0.10
datingDataMat,datingLabels = file2matrix('D:\python\Mechine learing in Action\KNN\datingTestSet.txt')
normMat,ranges,minVals = autoNorm(datingDataMat)
m = normMat.shape[0]
testNum = int(m * rate)
errorCount = 0.0
for i in range(1,testNum):
classifyResult = classify(normMat,normMat[testNum:m,:],datingLabels[testNum:m],3)
print("分类后的结果为:,", classifyResult)
print("原结果为:",datingLabels)
if(classifyResult != datingLabels):
errorCount += 1.0
print("误分率为:",(errorCount/float(testNum)))
###预测函数
def class
from numpy import *
import operator
from collections import Counter
import matplotlib
import matplotlib.pyplot as plt
###导入特征数据
def file2matrix(filename):
fr = open(filename)
contain = fr.readlines()###读取文件的所有内容
count = len(contain)
returnMat = zeros((count,3))
classLabelVector = []
index = 0
for line in contain:
line = line.strip() ###截取所有的回车字符
listFromLine = line.split('\t')
returnMat = listFromLine[0:3]###选取前三个元素,存储在特征矩阵中
classLabelVector.append(listFromLine[-1])###将列表的最后一列存储到向量classLabelVector中
index += 1
##将列表的最后一列由字符串转化为数字,便于以后的计算
dictClassLabel = Counter(classLabelVector)
classLabel = []
kind = list(dictClassLabel)
for item in classLabelVector:
if item == kind[0]:
item = 1
elif item == kind[1]:
item = 2
else:
item = 3
classLabel.append(item)
return returnMat,classLabel#####将文本中的数据导入到列表
##绘图(可以直观的表示出各特征对分类结果的影响程度)
datingDataMat,datingLabels = file2matrix('D:\python\Mechine learing in Action\KNN\datingTestSet.txt')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()
## 归一化数据,保证特征等权重
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))##建立与dataSet结构一样的矩阵
m = dataSet.shape[0]
for i in range(1,m):
normDataSet = (dataSet - minVals) / ranges
return normDataSet,ranges,minVals
##KNN算法
def classify(input,dataSet,label,k):
dataSize = dataSet.shape[0]
####计算欧式距离
diff = tile(input,(dataSize,1)) - dataSet
sqdiff = diff ** 2
squareDist = sum(sqdiff,axis = 1)###行向量分别相加,从而得到新的一个行向量
dist = squareDist ** 0.5
##对距离进行排序
sortedDistIndex = argsort(dist)##argsort()根据元素的值从大到小对元素进行排序,返回下标
classCount={}
for i in range(k):
voteLabel = label[sortedDistIndex[i]]
###对选取的K个样本所属的类别个数进行统计
classCount[voteLabel] = classCount.get(voteLabel,0) + 1
###选取出现的类别次数最多的类别
maxCount = 0
for key,value in classCount.items():
if value > maxCount:
maxCount = value
classes = key
return classes
##测试(选取10%测试)
def datingTest():
rate = 0.10
datingDataMat,datingLabels = file2matrix('D:\python\Mechine learing in Action\KNN\datingTestSet.txt')
normMat,ranges,minVals = autoNorm(datingDataMat)
m = normMat.shape[0]
testNum = int(m * rate)
errorCount = 0.0
for i in range(1,testNum):
classifyResult = classify(normMat,normMat[testNum:m,:],datingLabels[testNum:m],3)
print("分类后的结果为:,", classifyResult)
print("原结果为:",datingLabels)
if(classifyResult != datingLabels):
errorCount += 1.0
print("误分率为:",(errorCount/float(testNum)))
###预测函数
def class
gateway & data management - europelee 阅读原文»
即说明用户xxx在时间x对设备hue做了关灯操作。
smart gateway上命令的执行,设备消息通知都可以被记录,目前仅被记录用于做设备联动(IOT ITTT)的判断。
作为IOT,或者smart home除了简单的设备远程、无线控制,管理外,这些操作中产生的用户行为数据,
以及设备自产生数据可以存储起来,然后做进一步的机器学习,数据分析,最后反过来使得设备可以
更加智能控制,真正意义上的smart home.
数据存储:
命令的执行,设备消息通知分别为cmdlog, dev-notification。
cmdlog格式如下
设备类型 | 设备实例(UUID) | 设备方法 | 状态 | 用户 | 时间 |
hue | xxxxxxxx-xxxx- xxxx | bulbOn | power=0 | xxx | 2222-2-2 22:22:22
|
即说明用户xxx在时间x对设备hue做了关灯操作。
dev-notification格式如下
设备类型 | 设备实例(UUID) | 内容 | 时间 |
zigbee | xxxxxxxx-xxxx- xxxx | xxxx | 2222-2-2 22:22:22 |
上面的用户行为数据和设备自产生数据可以存储到cloud.
数据显示(监控),分析:
1. web服务器可以从db读取显示到前端供用户查看操控情况,设备状态数据,
以数据表格形式,和曲线图,饼状图等图形化形式来展现数据,做家庭的家电设备监控;
2. 数据分析系统做机器学习,进行数据分析,然后给出设备使用建议,更进一步,让家庭的设备系统自我改变。
比如通过长时间的数据积累,发现某家庭经常深夜还在看电视,并且声音会调得很小,客厅灯光亮度也会较低,
数据分析系统会自动推送一条规则(if 晚上过了12点 then smart tv声音关小;客厅灯光亮度调低)给该家庭gateway,
gateway检查到规则生效,就给smart tv, light发送命令,让tv声音自动关小,灯亮度自动降低,规则首次生效,会提示
用户是否同意。(这样省去用户手动设置ITTT规则)
流程架构如下图所示:
a. gateway 通过 http post等方式推送操作日志,设备数据到开源系统flume(Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data)
b. web服务器访问storage,或者flume获取cmdlog, dev-notification数据,将其以表格或者图形化形式展示给用户,
达到家庭设备监控目的。
c. 数据分析系统访问storage, 利用机器学习分析数据(使用spark开源系统做机器学习),生成设备使用建议,规则,推送给用户,gateway.
ps: 希望大家一起交流讨论!
本文链接:gateway & data management,转载请注明。
没有评论:
发表评论