用连续数值表示当前维度特征,通常会对数值型特征进行数学上的处理,主要的做法是归一化和离散化
幅度调整/归一化
特征与特征之间应该是平等的,区别应该体现在特征内部
例如房屋价格和住房面积的幅度是不同的,房屋价格可能在3000000 ~ 15000000 (万)之间,而住房面积在40-300 (平方米)之间,那么明明是平等的两个特征,输入到相同的模型中后由于本身的幅值不同导致产生的效果不同,这是不合理的
用之前的特征除以特征的最大值和最小值之差得出新的特征
# 1.引入依赖
import numpy as np
import pandas as pd
# 2.定义数据和预处理
docA = "The cat sat on my bed"
docB = "The dog sat on my knees"
bowA = docA.split(" ")
bowB = docB.split(" ")
# 3.构建词库
wordSet = set(bowA).union(set(bowB))
wordSet # {'The', 'bed', 'cat', 'dog', 'knees', 'my', 'on', 'sat'}
# 进行词数统计
# 用统计字典来保存词出现的次数
wordDictA = dict.fromkeys(wordSet, 0)
wordDictB = dict.fromkeys(wordSet, 0)
wordDictA
# {'The': 0,
# 'sat': 0,
# 'cat': 0,
# 'on': 0,
# 'dog': 0,
# 'my': 0,
# 'bed': 0,
# 'knees': 0}
# 遍历文档,统计词数
for word in bowA:
wordDictA[word] += 1
for word in bowB:
wordDictB[word] += 1
pd.DataFrame([wordDictA, wordDictB])
# The sat cat on dog my bed knees
# 0 1 1 1 1 0 1 1 0
# 1 1 1 0 1 1 1 0 1
# 4.计算词频TF
def computeTF( wordDict, bow ):
# 用一个字典对象记录tf,把所有的词对应在bow文档里的tf都算出来
tfDict = {
}
nbowCount = len(bow)
for word, count in wordDict.items():
tfDict[word] = count / nbowCount
return tfDict
tfA = computeTF(wordDictA, bowA)
tfB = computeTF(wordDictB, bowB)
tfA
# {'The': 0.16666666666666666,
# 'sat': 0.16666666666666666,
# 'cat': 0.16666666666666666,
# 'on': 0.16666666666666666,
# 'dog': 0.0,
# 'my': 0.16666666666666666,
# 'bed': 0.16666666666666666,
# 'knees': 0.0}
# 5.计算逆文档频率IDF
def computeIDF(wordDictList):
# 用一个字典对象保存idf结果,每个词作为key,初始值为0
idfDict = dict.fromkeys(wordDictList[0], 0)
N = len(wordDictList)
import math
for wordDict in wordDictList:
# 遍历字典中的每个词汇
for word, count in wordDict.items():
if count > 0:
# 先把Ni增加1,存入到idfDict
idfDict[word] += 1
# 已经得到所有词汇i对应的Ni,现在根据公式把它替换成为idf值
for word, ni in idfDict.items():
idfDict[word] = math.log10((N + 1) / (ni + 1))
return idfDict
idfs = computeIDF([wordDictA, wordDictB])
idfs
# {'The': 0.0,
# 'sat': 0.0,
# 'cat': 0.17609125905568124,
# 'on': 0.0,
# 'dog': 0.17609125905568124,
# 'my': 0.0,
# 'bed': 0.17609125905568124,
# 'knees': 0.17609125905568124}
# 6.计算TF-IDF
def computeTFIDF(tf, idfs):
tfidf = {
}
for word, tfval in tf.items():
tfidf[word] = tfval * idfs[word]
return tfidf
tfidfA = computeTFIDF(tfA, idfs)
tfidfB = computeTFIDF(tfB, idfs)
pd.DataFrame([tfidfA, tfidfB])
# The sat cat on dog my bed knees
# 0 0.0 0.0 0.029349 0.0 0.000000 0.0 0.029349 0.000000
# 1 0.0 0.0 0.000000 0.0 0.029349 0.0 0.000000 0.029349
# 1 引入依赖
import numpy as np
import pandas as pd
# 2 数据准备
# 评分矩阵R
R = np.array([[4,0,2,0,1],
[0,2,3,0,0],
[1,0,2,4,0],
[5,0,0,3,1],
[0,0,1,5,1],
[0,3,2,4,1]])
len(R[0]) # 5
# 3 算法实现
"""
输入参数:
R:M*N的评分矩阵
K:隐特征向量维度
max_iter:最大迭代次数
alpha:步长
lambda:正则化系数
输出:
分解之后的P,Q
P:初始化用户特征矩阵M*K
Q:初始化物品特征矩阵N*K
"""
# 给定超参数
K = 2
max_iter = 5000
alpha = 0.0002
lamda = 0.004
# 核心算法
def LFM_grad_desc( R, K=2, max_iter=1000, alpha=0.0001, lamda=0.002):
# 基本维度参数定义
M = len(R)
N = len(R[0])
# P,Q初始值,随机生成M*K的矩阵
P = np.random.rand(M, K)
Q = np.random.rand(N, K)
# 转置
Q = Q.T
# 开始迭代
for step in range(max_iter):
# 对所有的用户u,物品i做遍历,对应的特征向量Pu、Qi梯度下降
for u in range(M):
for i in range(N):
# 对于每一个大于0的评分,求出预测评分误差
if R[u][i] > 0:
eui = np.dot(P[u, :], Q[:, i]) - R[u][i]
# 代入公式,按照梯度下降算法更新当前的Pu、Qi
for k in range(K):
P[u][k] = P[u][k] - alpha * ( 2 * eui * Q[k][i] + 2 * lamda * P[u][k])
Q[k][i] = Q[k][i] - alpha * ( 2 * eui * P[u][k] + 2 * lamda * Q[k][i])
# u、i遍历完成,所有特征向量更新完成,可以得到P、Q,可以计算预测评分矩阵
predR = np.dot( P,Q )
# 计算当前损失函数
cost = 0
for u in range(M):
for i in range(N):
if R[u][i] > 0:
cost += (np.dot(P[u, :], Q[:, i]) - R[u][i]) ** 2
# 加上正则化项
for k in range(K):
cost += lamda * (P[u][k] ** 2 + Q[k][i] ** 2)
if cost < 0.0001:
break
return P, Q.T, cost
# 4 测试
P, Q, cost = LFM_grad_desc(R, K, max_iter, alpha, lamda)
print(P)
print(Q)
print(cost)
print(R)
predR = P.dot(Q.T)
predR
"""
[[ 1.51434749 0.77443196]
[ 1.24971278 1.50631155]
[ 0.3242702 1.54690507]
[ 1.87077959 -0.08405844]
[ 1.71301986 0.71429246]
[ 1.74590798 0.55058081]]
[[2.60086925 0.1612641 ]
[1.39956377 0.38112632]
[0.59704728 1.20348814]
[1.77147573 2.1578591 ]
[0.56379486 0.07498884]]
2.1410251115602126
[[4 0 2 0 1]
[0 2 3 0 0]
[1 0 2 4 0]
[5 0 0 3 1]
[0 0 1 5 1]
[0 3 2 4 1]]
array([[4.06350791, 2.41458229, 1.83615673, 4.35374487, 0.91185508],
[3.49325351, 2.32314771, 2.55896571, 5.46424393, 0.81753819],
[1.09284464, 1.04340306, 2.05528654, 3.91243996, 0.29882248],
[4.85209752, 2.58623846, 1.01578053, 3.13265437, 1.04843247],
[4.57053041, 2.6697162 , 1.88239635, 4.57591558, 1.01935575],
[4.62966731, 2.65335041, 1.7050071 , 4.28090943, 1.02562136]])
"""
# 历史热门电影统计
select mid, count(mid) as count from ratings group by mid
# => RateMoreMovies
# 近期热门电影统计
select mid, score, changeDate(timestamp) as yearmonth from ratings
# => ratingOfMonth
select mid, count(mid) as count ,yearmonth from ratingOfMonth group by yearmonth,mid order by yearmonth desc,count desc
# => RateMoreRecentlyMovies
# 电影平均评分统计
select mid, avg(score) as avg from ratings group by mid
# => AverageMovies
# 各类别 Top10 评分电影统计
select a.mid, genres, if(isnull(b.avg),0,b.avg) score from movies a left join averageMovies b on a.mid = b.mid
# => movieWithScore
spark.sql("select * from (select " +
"mid," +
"gen," +
"score, " +
"row_number() over(partition by gen order by score desc) rank " +
"from " +
"(select mid,score,explode(splitGe(genres)) gen from movieWithScore)
genresMovies) rankGenresMovies " +
"where rank <= 10")
文章浏览阅读1.5k次。1,MyUtuils.kt将被调用的文件class MyUtils { fun show(info:String){ println(info) }}fun show(info:String){ println(info)}2,Java文件调用该类,ClientJava.javapublic class ClientJava { public static void main(String[] args) { /** _java 调用kt 对象
文章浏览阅读6.6k次,点赞4次,收藏4次。在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对 像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助: 首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层. UDP属于运输层_最大请求报文大小
文章浏览阅读10w+次,点赞14次,收藏18次。代码如下:for /l %a in (0,0,1) do echo hello,world粘贴在cmd命令行窗口中,回车即可无限死循环输出hello,world。如果需要停止,可以按ctrl+c中断。解析通用形式:for /l %variable IN (start,step,end) DO command [command-parameters] 该集表示以增量形式从start到end的一个数字序列。具体到第一段代码,如果是 (0,0,1) 就是从0开始,每次增_cmd装比代码无限循环
文章浏览阅读917次,点赞18次,收藏11次。为了方便有学习需要的朋友,我把资料都整理成了视频教程(实际上比预期多花了不少精力)当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。
文章浏览阅读2k次,点赞5次,收藏14次。1、写出微分方程函数2、求解function dy=rigid(t,y)dy=zeros(3,1);dy(1)=y(2)*y(3);dy(2)=-y(1)*y(3);dy(3)=-0.51*y(1)*y(2);end%将微分方程写成函数形式,待调用options=odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]);[T Y]=ode45(@rigid,[0 12],[0 1 1],options);plot(T,Y(:,1),'-',T,Y_ode函数离散
文章浏览阅读3.8w次,点赞41次,收藏180次。==操作符与equals方法的区别_java中==和equals的区别
文章浏览阅读218次。1.官方的建议1.1 电池续航时间优化(Optimizing Battery Life)参考文章:优化电池使用时间已有中文的详细说明,此处做简要说明:(1)监控电池电量和充电状态(Monitoring the Battery Level and Charging State)通过系统广播,获取充电状态和电池电量的变化来调整数据更新等操作;如在充电时,更新数据及应用,在低电量时,减少更新频..._com.tencent.mm:exdevice
文章浏览阅读818次,点赞14次,收藏9次。计算e1=2.718,e5=148.413,e3=20.086,e1+e5+e3=171.217。“人/B 们/E 常/S 说/S 生/B 活/E 是/S 一/S 部/S 教/B 科/M 书/E ”给一段文字做分词标注,标注每个字对应的标号。图中是双向的三层 RNNs,堆叠多层的RNN网络,可以增加模型的参数,提高模型的拟合。双向的 RNN 是同时考虑“过去”和“未来”的信息,输入(黑色点)沿着黑色的实线箭。比如标签0将表示为([1,0,0,0,0,0,0,0,0,0]),标签3将表示为。
文章浏览阅读513次,点赞9次,收藏10次。无法加载DLL"halconxl": 找不到指定的模块。(异常来自HRESULT:0X8007007E)。在exe安装目录中中添加halconxl.dll文件继续运行就了。_c#如何免安装halcon12
文章浏览阅读1k次,点赞11次,收藏9次。你的键盘上应该有两个Ctrl键,按右边的Ctrl解决了。_键盘一直自动按ctrl
文章浏览阅读141次。Linux 命令【6】:cut文章目录一、简介二、命令详解三、实例演示一、简介cut 命令是一个将文本按列进行切分的小工具,它可以指定分隔每列的定界符。二、命令详解命令格式:cut {选项} {文件名}选项:-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。-c :以字符为单位进行分割。-d :自定义分隔符,默认为制表符。-f :与-d一起使用,指定显示哪个区域。-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一._cut使用特殊字符为分隔符
文章浏览阅读2.4k次。/** * 播放audio标签视频控制 * */ //等待音频加载完毕 点击每一段录音进行播放 $('.lis').click(function(){ $('.j_voiceCont').show(); var src = $(this).attr("src"); $(this).addClass('c_audiotrack可以设置进度吗